This is the way the code was before I integrated the Oracle BLOB patch.
The problem is the serialized stream is being truncated to 4000 bytes.
I just got an email from someone willing to work on implementing correct
BLOB handling.
I'd still like someone to try this in Oracle 8.
-dain
Stephen Coy wrote:
> I've done some more poking at this, and modified JDBCUtil.setParameter
> as follows:
>
> //
> // Binary types need to be converted to a byte array and set
> //
> if(isBinaryJDBCType(jdbcType))
> {
> byte[] bytes = convertObjectToByteArray(value);
>
> if (bytes.length < 2000 && jdbcType != Types.BLOB)
> {
> // it's more efficient to use setBinaryStream for large
> // streams, and causes problems if not done on some DBMS
> // implementations
> ps.setBytes(index, bytes);
> } else
> {
> InputStream in = null;
> try
> {
> in = new ByteArrayInputStream(bytes);
> ps.setBinaryStream(index, in, bytes.length);
> } finally
> {
> safeClose(in);
> }
> }
> return;
>
> ie. Forget about the ByteArrayBlob class.
>
> This works fine when writing to the database.
>
> However, reading the data back fails:
>
> 2002-06-18 23:59:20,671 DEBUG
> [org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.SimpleEJB]
> Executing SQL: SELECT booleanPrimitive, booleanObject, bytePrimitive,
> byteObject, shortPrimitive, shortObject, integerPrimitive,
> integerObject, longPrimitive, longObject, floatPrimitive, floatObject,
> doublePrimitive, doubleObject, stringValue, utilDateValue, sqlDateValue,
> timeValue, timestampValue, bigDecimalValue, byteArrayValue, objectValue
> FROM SIMPLE WHERE (id=?)
> 2002-06-18 23:59:20,680 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.id]
> Set parameter: index=1, jdbcType=VARCHAR, value=simple
> 2002-06-18 23:59:20,707 TRACE
>
>[org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.booleanPrimitive]
>
>
> Get result: index=1, javaType=boolean, Simple, value=true
> 2002-06-18 23:59:20,709 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.booleanObject]
>
> Get result: index=2, javaType=java.lang.Boolean, Simple, value=false
> 2002-06-18 23:59:20,713 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.bytePrimitive]
>
> Get result: index=3, javaType=byte, Simple, value=11
> 2002-06-18 23:59:20,715 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.byteObject]
>
> Get result: index=4, javaType=java.lang.Byte, Simple, value=22
> 2002-06-18 23:59:20,717 TRACE
>
>[org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.shortPrimitive]
>
> Get result: index=5, javaType=short, Simple, value=33
> 2002-06-18 23:59:20,718 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.shortObject]
>
> Get result: index=6, javaType=java.lang.Short, Simple, value=44
> 2002-06-18 23:59:20,720 TRACE
>
>[org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.integerPrimitive]
>
>
> Get result: index=7, javaType=int, Simple, value=55
> 2002-06-18 23:59:20,726 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.integerObject]
>
> Get result: index=8, javaType=java.lang.Integer, Simple, value=66
> 2002-06-18 23:59:20,728 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.longPrimitive]
>
> Get result: index=9, javaType=long, Simple, value=77
> 2002-06-18 23:59:20,730 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.longObject]
>
> Get result: index=10, javaType=java.lang.Long, Simple, value=88
> 2002-06-18 23:59:20,731 TRACE
>
>[org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.floatPrimitive]
>
> Get result: index=11, javaType=float, Simple, value=11.11
> 2002-06-18 23:59:20,733 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.floatObject]
>
> Get result: index=12, javaType=java.lang.Float, Simple, value=22.22
> 2002-06-18 23:59:20,735 TRACE
>
>[org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.doublePrimitive]
>
>
> Get result: index=13, javaType=double, Simple, value=33.33
> 2002-06-18 23:59:20,738 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.doubleObject]
>
> Get result: index=14, javaType=java.lang.Double, Simple, value=44.44
> 2002-06-18 23:59:20,740 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.stringValue]
>
> Get result: index=15, javaType=java.lang.String, Simple, value=test
> string value
> 2002-06-18 23:59:20,742 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.utilDateValue]
>
> Get result: index=16, javaType=java.util.Date, Simple, value=1970-01-01
> 11:00:01.111
> 2002-06-18 23:59:20,744 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.sqlDateValue]
>
> Get result: index=17, javaType=java.sql.Date, Simple, value=1981-05-05
> 2002-06-18 23:59:20,746 TRACE
> [org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.timeValue]
>
> Get result: index=18, javaType=java.sql.Time, Simple, value=22:33:44
> 2002-06-18 23:59:20,748 TRACE
>
>[org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.timestampValue]
>
> Get result: index=19, javaType=java.sql.Timestamp, Simple,
> value=1970-01-01 11:00:04.444
> 2002-06-18 23:59:20,749 TRACE
>
>[org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.bigDecimalValue]
>
>
> Get result: index=20, javaType=java.math.BigDecimal, Simple,
> value=12345678
> 2002-06-18 23:59:20,751 TRACE
>
>[org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMP2xFieldBridge.SimpleEJB.byteArrayValue]
>
> Get result: index=21, javaType=[B, Simple, value=[B@2b8a17
> 2002-06-18 23:59:20,758 TRACE
> [org.jboss.ejb.plugins.EntitySynchronizationInterceptor] loadEntity
> Exception, clear tx for
> ctx=org.jboss.ejb.EntityEnterpriseContext@74683e,
> tx=TransactionImpl:XidImpl [FormatId=257,
> GlobalId=edoras.resolvesw.com.au//40, BranchQual=]
> 2002-06-18 23:59:20,760 TRACE
> [org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy] entryRemoved,
> entry=key: null, object: null, entry: 67e62c
> 2002-06-18 23:59:20,762 TRACE
> [org.jboss.ejb.plugins.EntityInstanceInterceptor] Ending invoke,
> exceptionThrown, ctx=org.jboss.ejb.EntityEnterpriseContext@74683e
> 2002-06-18 23:59:20,764 TRACE
> [org.jboss.ejb.plugins.EntityInstanceInterceptor] End invoke,
> key=simple, ctx=org.jboss.ejb.EntityEnterpriseContext@74683e
> 2002-06-18 23:59:20,765 TRACE
> [org.jboss.ejb.plugins.EntityLockInterceptor] End invoke, key=simple
> 2002-06-18 23:59:20,766 TRACE [org.jboss.ejb.plugins.TxInterceptorCMT]
> TxInterceptorCMT: In finally
> 2002-06-18 23:59:20,770 ERROR [org.jboss.ejb.plugins.LogInterceptor]
> TransactionRolledbackException, causedBy:
> java.sql.SQLException: Unable to load to deserialize result:
> java.io.StreamCorruptedException: InputStream does not contain a
> serialized object
> at org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.convertByteArrayToObject
> (JDBCUtil.java:599)
> at org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.getResult(JDBCUtil.java:306)
> at
>
>org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPFieldBridge.loadArgumentResults(
>
> JDBCAbstractCMPFieldBridge.java:350)
> at
>
>org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPFieldBridge.loadInstanceResults(
>
> JDBCAbstractCMPFieldBridge.java:304)
> at org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.execute
> (JDBCLoadEntityCommand.java:142)
> at org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.execute
> (JDBCLoadEntityCommand.java:62)
> at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.loadEntity
> (JDBCStoreManager.java:569)
> at org.jboss.ejb.plugins.CMPPersistenceManager.loadEntity
> (CMPPersistenceManager.java:410)
> at
> org.jboss.resource.connectionmanager.CachedConnectionInterceptor.loadEntity(
>
> CachedConnectionInterceptor.java:353)
> at org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invoke
> (EntitySynchronizationInterceptor.java:262)
> at
> org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke
> (CachedConnectionInterceptor.java:186)
> at org.jboss.ejb.plugins.EntityInstanceInterceptor.invoke
> (EntityInstanceInterceptor.java:152)
> at
> org.jboss.ejb.plugins.EntityLockInterceptor.invoke(EntityLockInterceptor.java:
>
> 107)
> at org.jboss.ejb.plugins.EntityCreationInterceptor.invoke
> (EntityCreationInterceptor.java:69)
> at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext
> (AbstractTxInterceptor.java:96)
> at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions
> (TxInterceptorCMT.java:176)
> at
> org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:61)
> at
> org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:
> 129)
> at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:183)
> at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke
> (ProxyFactoryFinderInterceptor.java:156)
> at org.jboss.ejb.EntityContainer.invoke(EntityContainer.java:482)
> at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invoke
> (BaseLocalProxyFactory.java:304)
> at org.jboss.ejb.plugins.local.EntityProxy.invoke(EntityProxy.java:38)
> at $Proxy41.getBooleanPrimitive(Unknown Source)
> at org.jboss.test.cmp2.simple.SimpleUnitTestCase.testBooleanPrimitive
> (SimpleUnitTestCase.java:90)
> at java.lang.reflect.Method.invoke(Native Method)
> at junit.framework.TestCase.runTest(TestCase.java:166)
> at junit.framework.TestCase.runBare(TestCase.java:140)
> at net.sourceforge.junitejb.EJBTestCase.runBare(EJBTestCase.java:133)
> at
> net.sourceforge.junitejb.EJBTestRunnerBean.runTestCase(EJBTestRunnerBean.java:
>
> 102)
> at
> net.sourceforge.junitejb.EJBTestRunnerBean.run(EJBTestRunnerBean.java:44)
> at java.lang.reflect.Method.invoke(Native Method)
> at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke
> (StatelessSessionContainer.java:606)
> at
> org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke
> (CachedConnectionInterceptor.java:186)
> at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext
> (AbstractTxInterceptor.java:96)
> at org.jboss.ejb.plugins.AbstractTxInterceptorBMT.invokeNext
> (AbstractTxInterceptorBMT.java:144)
> at
> org.jboss.ejb.plugins.TxInterceptorBMT.invoke(TxInterceptorBMT.java:62)
> at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke
> (StatelessSessionInstanceInterceptor.java:77)
> at
> org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:
> 129)
> at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:183)
> at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke
> (ProxyFactoryFinderInterceptor.java:156)
> at
> org.jboss.ejb.StatelessSessionContainer.invoke(StatelessSessionContainer.java:
>
> 303)
> at org.jboss.ejb.Container.invoke(Container.java:687)
> at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:549)
> at
> org.jboss.invocation.jrmp.server.JRMPInvoker.invoke(JRMPInvoker.java:321)
> at java.lang.reflect.Method.invoke(Native Method)
> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:241)
> at sun.rmi.transport.Transport$1.run(Transport.java:152)
> at java.security.AccessController.doPrivileged(Native Method)
> at sun.rmi.transport.Transport.serviceCall(Transport.java:148)
> at
> sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:465)
> at
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:
> 706)
> at java.lang.Thread.run(Thread.java:496)
> 2002-06-18 23:59:20,789 TRACE [org.jboss.ejb.plugins.LogInterceptor] End
> method=getBooleanPrimitive
>
> This seems to indicate that the BLOB was reloaded correctly, but the
> OBJECT column was fubar.
>
> A possible cause of this is that I don't think that you can use
> ResultSet.getBytes to recover the data from a BLOB that was written with
> PreparedStatement.setBinaryStream.
>
> Unfortunately, it will be another day before I can pursue this further.
>
>
>
> On Sunday, June 16, 2002, at 03:28 PM, Dain Sundstrom wrote:
>
>> I just committed the code from patch [ 525663 ] CMP and oracle blobs.
>> Can some with Oracle check if the code actually works?
>>
>> The following command will execute a new test I added which has a
>> field of every type:
>>
>> ./build.sh -Dtest=org.jboss.test.cmp2.simple.SimpleUnitTestCase one-test
>>
>> You'll need to change the datasource and datasource-mapping in the
>> src/resources/cmp2/simple/META-INF/jbosscmp-jdbc.xml file.
>>
>> This won't work perfectly for every database vendor, because some
>> vendor's don't support millisecond precise time and nanosecond precise
>> timestamp values. The test that is important for blobs is
>> testObjectValue.
>
>
>
> ----------------------------------------------------------------------------
>
> Bringing you mounds of caffeinated joy
> >>> http://thinkgeek.com/sf <<<
>
> _______________________________________________
> Jboss-development mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/jboss-development
--
xxxxxxxxxxxxxxxxxxxxxxxx
Dain Sundstrom
Chief Architect JBossCMP
JBoss Group, LLC
xxxxxxxxxxxxxxxxxxxxxxxx
----------------------------------------------------------------------------
Bringing you mounds of caffeinated joy
>>> http://thinkgeek.com/sf <<<
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development