[jboss-user] [JBoss Seam] - ERROR: invalid large-object descriptor: 0 with postgreql

hazlorealidad do-not-reply at jboss.com
Fri Sep 15 11:07:04 EDT 2006


I have a problem reading Blob s in postgres 
ERROR: invalid large-object descriptor: 0 (in the log you see the spanish translation)

I am not sure if it is to do with hibernate, postgres or seam.

What I wanted to do is download a file thats in a Blob.

I wrote a test using pure jdbc and the Blob in the database can be read correctly as long as autocomit is set to false.

There are other pages that say the problem happens when not in a transaction
http://jira.jboss.com/jira/browse/JBPORTAL-575
http://archives.postgresql.org/pgsql-general/2004-09/msg00848.php
http://archives.postgresql.org/pgsql-interfaces/2000-10/msg00004.php

http://jdbc.postgresql.org/documentation/80/binary-data.html says
You must access Large Objects within an SQL  transaction block. You can start a transaction block by calling setAutoCommit(false).

but I am using a stateful session bean with an extended persistent context
also added    em.joinTransaction(); just to make sure.

In the log it shows that it is in a JTATransaction, does that mean that there is a JDBC Transaction to the database?

Two related questions:
Is what I am doing the best way to download a file?

Another question I have is when writing the Blob I use
Blob blob=Hibernate.createBlob(stream);
but dont know if this requires that the whole file be in memory.
If so how can I write it using an OutputStream

thanks in advance

Andy Bailey


In the entity bean i have

@Entity
@Name("document")
public class Document 
{
private Blob content;
	@Lob @Basic(fetch = FetchType.EAGER)
	public Blob getContent() 
	{
		return content;
	}

	public void setContent(Blob content) 
	{
		this.content = content;
	}
...
}



@Stateful
@Scope(SESSION)
@Name("documents")
public class DocumentsBean implements Serializable, Documents
{
	@DataModel                                                                           
   private List documentList;
   
   @DataModelSelection   
   @In(required=false)
   @Out(required=false)                                                                  
   private Document document;
   
   @PersistenceContext(type=EXTENDED)                                                  
   private EntityManager em;
   
  public void download()
   {
	   //try to solve problem with blobs in postgres outside of transactions
   	   em.joinTransaction();
   	   
   	FacesContext context = FacesContext.getCurrentInstance();
   	      
   	      HttpServletResponse response = 
   	         ( HttpServletResponse ) context.getExternalContext().getResponse();
   	      
   	      String fileName=document.getFileName();
   	      String contentType=document.getContentType();
   	      int read = 0;
   	      byte[] bytes = new byte[1024];
 
   	      response.setContentType(contentType);

   	      response.setHeader("Content-Disposition", "attachment;filename=\"" +
   	         fileName + "\""); 
   	      InputStream is = null;
   	      OutputStream os = null;
   	      
   	         try {
   	        	 
   	        	 Blob blob=document.getContent();
					is = blob.getBinaryStream();
			
   	         os = response.getOutputStream();
   	         while((read = is.read(bytes)) != -1){
   	            os.write(bytes,0,read);
   	         }

   	         os.flush();
   	         os.close();
   	         }
   	         catch (Exception e) 
   	         {
					logger.error("download "+document,e);
			} 

   	         FacesContext.getCurrentInstance().responseComplete();
   	    
   }


Excerpt from the logs


2006-09-15 09:04:17,730 DEBUG [org.jboss.seam.contexts.Contexts] found in session context: documents
2006-09-15 09:04:17,730 DEBUG [org.jboss.seam.jsf.SeamVariableResolver] resolved name to seam component
2006-09-15 09:04:17,730 DEBUG [org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor] ++++ LongLivedSessionPropagationInterceptor
2006-09-15 09:04:17,730 DEBUG [org.hibernate.jdbc.JDBCContext] TransactionFactory reported no active transaction; Synchronization not
registered
2006-09-15 09:04:17,730 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join
2006-09-15 09:04:17,730 DEBUG [org.hibernate.jdbc.JDBCContext] successfully registered Synchronization
2006-09-15 09:04:17,731 DEBUG [org.jboss.seam.contexts.Contexts] found in event context: document
2006-09-15 09:04:17,731 DEBUG [org.jboss.seam.Component] selected row: c cldc_mvm.pdf 130907 application/pdf
2006-09-15 09:04:17,731 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join
2006-09-15 09:04:17,731 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Transaction already joined
2006-09-15 09:04:17,800 DEBUG [org.jboss.seam.Component] instantiating Seam component: interpolator
2006-09-15 09:04:17,800 ERROR [com.hazlorealidad.sgi.control.DocumentsBean] download c cldc_mvm.pdf 130907 application/pdf
java.io.IOException: java.sql.SQLException: ERROR: el descriptor de objeto grande no es válido: 0
        at org.postgresql.largeobject.BlobInputStream.read(BlobInputStream.java:97)
        at java.io.InputStream.read(InputStream.java:164)
        at java.io.InputStream.read(InputStream.java:89)
        at com.hazlorealidad.sgi.control.DocumentsBean.download(DocumentsBean.java:139)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
        at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
        at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
        at org.jboss.seam.interceptors.ValidationInterceptor.validateTargetComponent(ValidationInterceptor.java:64)
        at sun.reflect.GeneratedMethodAccessor444.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.jboss.seam.util.Reflections.invoke(Reflections.java:13)
        at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:90)
        at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:60)
        at org.jboss.seam.interceptors.OutcomeInterceptor.interceptOutcome(OutcomeInterceptor.java:21)
        at sun.reflect.GeneratedMethodAccessor443.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.jboss.seam.util.Reflections.invoke(Reflections.java:13)

...
] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces}
2006-09-15 09:04:17,910 DEBUG [org.jboss.seam.jsf.SeamExtendedManagedPersistencePhaseListener] committing transaction after phase: INVOKE_APPLICATION(5)
2006-09-15 09:04:17,910 DEBUG [org.jboss.seam.util.Naming] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces}
2006-09-15 09:04:17,910 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] processing flush-time cascades
2006-09-15 09:04:17,910 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] dirty checking collections
2006-09-15 09:04:17,910 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
2006-09-15 09:04:17,910 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 (re)creations, 0 updates, 0 removals
to 0 collections
2006-09-15 09:04:17,910 DEBUG [org.hibernate.pretty.Printer] listing entities:
2006-09-15 09:04:17,911 DEBUG [org.hibernate.pretty.Printer] com.hazlorealidad.sgi.model.Document{digital=false, dateRegistered=2006-09-15 09:03:53, length=130907, content=org.hibernate.lob.SerializableBlob at e21cfc, controlled=true, contentType=application/pdf, external=false, id=23, version=1.0, fileName=cldc_mvm.pdf, dateModified=null, state=null, url=null, name=c}
2006-09-15 09:04:17,911 DEBUG [org.hibernate.jdbc.ConnectionManager] aggressively releasing JDBC connection
2006-09-15 09:04:17,911 DEBUG [org.hibernate.jdbc.JDBCContext] TransactionFactory reported no active transaction; Synchronization not..

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3971942#3971942

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3971942




More information about the jboss-user mailing list