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