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

Reply via email to