Inserir imagens no postgreSQL e ver com JSP

Olá Pessoal…
meu nome é Alberto, sou aluno de computação em João Pessoa - PB
estou começando a usar o PostgreSQL agora e preciso fazer uma aplicação para armazenar imagens e ver essas imagens numa aplicação JSP.
vi o artigo: http://www.imasters.com.br/artigo/1779.
Gostaria de saber se pode me ajudar com isso? a aplicação tem mais de 4 mil fotos e pelo que li, devo usar campo BYTEA.
Quando fizer um Select, será necessário gerar a foto numa pasta temporária?
Qual a melhor solução pra inserir 4 mil fotos, armazenar em banco ou em diretórios?

Pode me ajudar? me indicar um bom material para aprender? mostrar uns exemplos?

Desda já agradeço… muito obrigado!

[]'s Alberto Ivo

Qual o tamanho das imagens? Eu deixo as minhas no banco, o meu software as converte para PNG, faz compressão, e depois armazena.

Na minha classe de modelo, o campo "foto" é do tipo Image, mas para gravar em banco é preciso converter para um vetor de byte. Não sei se Blob ou Clob funcionam, mas acredito que sim, e provavelmente de um jeito mais fácil… Segue o código pra converter imagens pra byte array, e vice-versa:

/**
 * ImageUtils.java
 */

package br.esfera.desktop.util;

import java.awt.Graphics2D;
import java.awt.Image;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.ByteBuffer;

/**
 *
 * @author rodrigogh
 */
public final class ImageUtils {
    
    // 5 x 7 cm
    static final int IMG_WIDTH = 142;
    static final int IMG_HEIGHT = 198;
    
    public static BufferedImage loadImage(File file) {
        BufferedImage image = null;
        try {
            
            image = ImageIO.read(file);
            if ( image.getWidth() != IMG_WIDTH || image.getHeight() != IMG_HEIGHT )
                image = scale(image);
            
            return image;
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return image;
        }
    }
    
    public static BufferedImage loadImage(String filePath) {
        BufferedImage image = null;
        try {
            
            image = ImageIO.read(ImageUtils.class.getResourceAsStream(filePath));
            if ( image.getWidth() != IMG_WIDTH || image.getHeight() != IMG_HEIGHT )
                image = scale(image);
            
            return image;
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return image;
        }
    }
    
    public static BufferedImage toImage(int[] pixels) {
        BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
        image.setRGB(0, 0, IMG_WIDTH, IMG_HEIGHT, pixels, 0, IMG_WIDTH);
        return image;
    }
    
    public static int[] toPixels(BufferedImage image) {
        int[] pixels = new int [ image.getWidth() * image.getHeight() ];
        image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
        return pixels;
    }
    
    public static BufferedImage toImage(byte[] data) {
        
        int[] pixels = new int [ data.length ];
        ByteBuffer buffer = ByteBuffer.wrap(data);
        
        int i = 0;
        while ( buffer.position() &lt buffer.capacity() ) {
            pixels[i] = buffer.getInt();
            i++;
        }
        
        return toImage(pixels);
    }
    
    public static byte[] toByteArray(BufferedImage image) {
        
        int[] pixels = toPixels(image);
        ByteBuffer buffer = ByteBuffer.allocate(pixels.length * 4);
        for ( int pixel : pixels ) {
            buffer.putInt(pixel);
        }
        
        return buffer.array();
    }
    
    private static BufferedImage scale(BufferedImage image) {
        
        Image scaled = image.getScaledInstance(IMG_WIDTH, IMG_HEIGHT, Image.SCALE_SMOOTH);
        image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
        
        Graphics2D g2d = image.createGraphics();
        g2d.drawImage(scaled, 0, 0, null);
        g2d.dispose();
        
        return image;
    }
    
}