Win2000 operating system
MySQL or MS SQLServer 2000 databases
mapping in standardjbosscmp-jdbc.xml (same as in 3.0)
for mySQL
<java-type>java.lang.Object</java-type>
<jdbc-type>JAVA_OBJECT</jdbc-type>
<sql-type>LONGBLOB</sql-type>
<java-type>java.lang.Object</java-type>
<jdbc-type>JAVA_OBJECT</jdbc-type>
<sql-type>IMAGE</sql-type>
Repeat scenario
Having CMP2 entity bean with one Object atribute.
Call setObject works fine and store as a Blob in
database.
When trying to retreive after, failure happens.
Stacktrace attached below
*Notes:
1. Serialization and deserialization doing only with 3.01
version of JBoss
2. Not trying to deserealize old blobs (I am aware of it
can be not supported and compatible with earlier version
of JBoss)
3. This functionality and same code works fine with
previous JBoss 3.0 version, but it is broken in 3.01.
Thanks
Stacktrace
*********
10:51:02,738 ERROR [LogInterceptor]
TransactionRolledbackLocalException, causedB
y:
java.sql.SQLException: Unable to load to deserialize
result: java.io.StreamCorru
ptedException: invalid stream header
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.convertByteArra
yToObject(JDBC
Util.java:612)
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.getResult
(JDBCUtil.java:311)
at
org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMP
FieldBridge.load
ArgumentResults
(JDBCAbstractCMPFieldBridge.java:350)
at
org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMP
FieldBridge.load
InstanceResults(JDBCAbstractCMPFieldBridge.java:304)
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityComman
d.execute(JDBCLoad
EntityCommand.java:142)
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityComman
d.execute(JDBCLoad
EntityCommand.java:62)
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.load
Entity(JDBCStoreM
anager.java:572)
at
org.jboss.ejb.plugins.CMPPersistenceManager.loadEntit
y(CMPPersistence
Manager.java:410)
at
org.jboss.resource.connectionmanager.CachedConnectio
nInterceptor.load
Entity(CachedConnectionInterceptor.java:353)
at
org.jboss.ejb.plugins.EntitySynchronizationInterceptor.inv
oke(EntityS
ynchronizationInterceptor.java:262)
at
org.jboss.resource.connectionmanager.CachedConnectio
nInterceptor.invo
ke(CachedConnectionInterceptor.java:186)
at
org.jboss.ejb.plugins.EntityInstanceInterceptor.invoke
(EntityInstance
Interceptor.java:152)
at
org.jboss.ejb.plugins.EntityLockInterceptor.invoke
(EntityLockIntercep
tor.java:107)
at
org.jboss.ejb.plugins.EntityCreationInterceptor.invoke
(EntityCreation
Interceptor.java:69)
at
org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext
(AbstractTxInte
rceptor.java:107)
at
org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransacti
ons(TxIntercep
torCMT.java:178)
at org.jboss.ejb.plugins.TxInterceptorCMT.invoke
(TxInterceptorCMT.java:6
0)
at org.jboss.ejb.plugins.SecurityInterceptor.invoke
(SecurityInterceptor.
java:130)
at org.jboss.ejb.plugins.LogInterceptor.invoke
(LogInterceptor.java:203)
at org.jboss.ejb.EntityContainer.invoke
(EntityContainer.java:493)
at
org.jboss.ejb.plugins.local.BaseLocalContainerInvoker.inv
oke(BaseLoca
lContainerInvoker.java:301)
at org.jboss.ejb.plugins.local.EntityProxy.invoke
(EntityProxy.java:38)
at $Proxy161.getKeyValue(Unknown Source)
at com.rendition.MyEJB.retrieveKey
(MyEJB.java:155)
******
Logged In: NO
Any news?
Or whom should be assigned?
Thanks
Logged In: YES
user_id=251431
I don't use MS SQL Server, but I'll see if this works with
my databases. It may just be a SQL Server bug.
Logged In: NO
We are using Oracle and map a String[] to a Blob and we do get the same exception.
Logged In: YES
user_id=251431
I spend all day testing this and have determined the following:
Value classes in 3.0.0 were really broken. You can not have
a field of type java.lang.Object and get the value back out.
If you have a field of some custom type (like
my.custom.ValueClass), it will work until you redeploy your
applcation and then you get class cast exceptions because of
a classloader conflict.
Value classes work perfectly in 3.0.2 if the field was
stored using 3.0.2. If it was stored with 3.0.0, it will
work the first time you deploy, but you will get a class
cast exception on redeploy. This is because 3.0.0 stored a
java.rmi.MarshalledObject, which doesn't respect
classloaders, and 3.0.1+ stores a MarshalledValue, which
uses classloaders correctly.
To make a long story short, there is nothing more we can do.
Hopefully this will be the last data incompatiblity we
have, but there is no guarantee. I suggest you try to find
a way to store you values in a more portable way in the
database, such as an xml string.
Logged In: YES
user_id=595649
Hi Dan,
The problem still exists in 3.02 as well.
In 3.02 deserialization works fine until first shut down the
server.
Next time server starting, same exception happens (please
see below). So probably in 3.02 was work around of keeping
in cash? But it is still broken though.
**Important note: objects were serialized and deserialized in
3.02. So, something big missing here.
I have tested with 3 databases: mySQL, SQLServer2000 and
Oracle9i
And You can't not to use Blob if You want to store crypto key
for example.
If it is impossible to fix, please say so.
Thanks in advance,
Boris
****
16:51:48,395 ERROR [LogInterceptor]
TransactionRolledbackLocalException, causedB
y:
java.sql.SQLException: Unable to load to deserialize result:
java.io.StreamCorru
ptedException: invalid stream header
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.convertByteArrayToO
bject(JDBC
Util.java:612)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.getResult
(JDBCUtil.java:311)
at
org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPField
Bridge.load
ArgumentResults(JDBCAbstractCMPFieldBridge.java:350)
at
org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPField
Bridge.load
InstanceResults(JDBCAbstractCMPFieldBridge.java:304)
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.exe
cute(JDBCLoad
EntityCommand.java:147)
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.exe
cute(JDBCLoad
EntityCommand.java:62)
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.loadEntity
(JDBCStoreM
anager.java:572)
at
org.jboss.ejb.plugins.CMPPersistenceManager.loadEntity
(CMPPersistence
Manager.java:410)
at
org.jboss.resource.connectionmanager.CachedConnectionInte
rceptor.load
Entity(CachedConnectionInterceptor.java:353)
at
org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invoke
(EntityS
ynchronizationInterceptor.java:262)
at
org.jboss.resource.connectionmanager.CachedConnectionInte
rceptor.invo
ke(CachedConnectionInterceptor.java:186)
at org.jboss.ejb.plugins.EntityInstanceInterceptor.invoke
(EntityInstance
Interceptor.java:152)
at org.jboss.ejb.plugins.EntityLockInterceptor.invoke
(EntityLockIntercep
tor.java:107)
at org.jboss.ejb.plugins.EntityCreationInterceptor.invoke
(EntityCreation
Interceptor.java:69)
at
org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext
(AbstractTxInte
rceptor.java:107)
at
org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions
(TxIntercep
torCMT.java:178)
at org.jboss.ejb.plugins.TxInterceptorCMT.invoke
(TxInterceptorCMT.java:6
0)
at org.jboss.ejb.plugins.SecurityInterceptor.invoke
(SecurityInterceptor.
java:130)
at org.jboss.ejb.plugins.LogInterceptor.invoke
(LogInterceptor.java:203)
at org.jboss.ejb.EntityContainer.invoke
(EntityContainer.java:493)
at
org.jboss.ejb.plugins.local.BaseLocalContainerInvoker.invoke
(BaseLoca
lContainerInvoker.java:301)
at org.jboss.ejb.plugins.local.EntityProxy.invoke
(EntityProxy.java:38)
at $Proxy174.getKeyValue(Unknown Source)
**
Logged In: YES
user_id=595649
Hi Dan,
The problem still exists in 3.02 as well.
In 3.02 deserialization works fine until first shut down the
server.
Next time server starting, same exception happens (please
see below). So probably in 3.02 was work around of keeping
in cash? But it is still broken though.
**Important note: objects were serialized and deserialized in
3.02. So, something big missing here.
I have tested with 3 databases: mySQL, SQLServer2000 and
Oracle9i
And You can't not to use Blob if You want to store crypto key
for example.
If it is impossible to fix, please say so.
Thanks in advance,
Boris
****
16:51:48,395 ERROR [LogInterceptor]
TransactionRolledbackLocalException, causedB
y:
java.sql.SQLException: Unable to load to deserialize result:
java.io.StreamCorru
ptedException: invalid stream header
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.convertByteArrayToO
bject(JDBC
Util.java:612)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil.getResult
(JDBCUtil.java:311)
at
org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPField
Bridge.load
ArgumentResults(JDBCAbstractCMPFieldBridge.java:350)
at
org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCAbstractCMPField
Bridge.load
InstanceResults(JDBCAbstractCMPFieldBridge.java:304)
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.exe
cute(JDBCLoad
EntityCommand.java:147)
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCLoadEntityCommand.exe
cute(JDBCLoad
EntityCommand.java:62)
at
org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.loadEntity
(JDBCStoreM
anager.java:572)
at
org.jboss.ejb.plugins.CMPPersistenceManager.loadEntity
(CMPPersistence
Manager.java:410)
at
org.jboss.resource.connectionmanager.CachedConnectionInte
rceptor.load
Entity(CachedConnectionInterceptor.java:353)
at
org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invoke
(EntityS
ynchronizationInterceptor.java:262)
at
org.jboss.resource.connectionmanager.CachedConnectionInte
rceptor.invo
ke(CachedConnectionInterceptor.java:186)
at org.jboss.ejb.plugins.EntityInstanceInterceptor.invoke
(EntityInstance
Interceptor.java:152)
at org.jboss.ejb.plugins.EntityLockInterceptor.invoke
(EntityLockIntercep
tor.java:107)
at org.jboss.ejb.plugins.EntityCreationInterceptor.invoke
(EntityCreation
Interceptor.java:69)
at
org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext
(AbstractTxInte
rceptor.java:107)
at
org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions
(TxIntercep
torCMT.java:178)
at org.jboss.ejb.plugins.TxInterceptorCMT.invoke
(TxInterceptorCMT.java:6
0)
at org.jboss.ejb.plugins.SecurityInterceptor.invoke
(SecurityInterceptor.
java:130)
at org.jboss.ejb.plugins.LogInterceptor.invoke
(LogInterceptor.java:203)
at org.jboss.ejb.EntityContainer.invoke
(EntityContainer.java:493)
at
org.jboss.ejb.plugins.local.BaseLocalContainerInvoker.invoke
(BaseLoca
lContainerInvoker.java:301)
at org.jboss.ejb.plugins.local.EntityProxy.invoke
(EntityProxy.java:38)
at $Proxy174.getKeyValue(Unknown Source)
**
Logged In: YES
user_id=595649
I wanted to add:
Scenario is:
1.start JBoss3.02
2.serialize object with CMP and persist
3. deserialize object
(everything works great)
4. Shutdown Jboss
5.start jBoss
6. deserialize again persisted object
Boom !!! Exception
Doesn't works for String, and for byte[]
Logged In: YES
user_id=463096
The handling of large character and binary columns has been completely
overhauled.
The stack trace looks like a typical manifestation of JBoss's earlier
BLOB/CLOB problems,
Note that the JAVA_OBJECT jdbc type should probably not be mapped
to binary columns - use VARBINARY, LONGVARBINARY or CLOB
instead (of JAVA_OBJECT).
Anyway, with correct mappings I believe this is fixed.
Logged In: YES
user_id=595649
Is it fixed in release, or in CVS?
In JBoss 3.0.3 is not seem to be fixed.
Thanks
Logged In: YES
user_id=463096
I believe that its fixed in Branch_3_0, Branch_3_2 and HEAD
Logged In: YES
user_id=389955
It seems to be fixed in 3.0.4 (in 3.2.0beta it is NOT fixed).
Logged In: YES
user_id=251431
I am no no longer a JBoss committer, so I am unable to fix
any bugs.
Logged In: YES
user_id=543482
Please, reopen if it is not fixed.