usar el abstract factory con spring

Hola Muchachos:

En esta pagina explican el detalle de abstract factory
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObjec...

hay alguien de la comunidad que sepa implementar por ejemplo si estoy con mysql y oracle y deseo
implementar las dos cosas tal como lo muestra el link pero no como hacerlo en spring alguien tiene un
ejemplo de esto, por ejemplo en ese link hablan del pool de conexiones como se crea mediane codigo??

en dao , si tengo 10 tablas son diez dao ademas por cada dao una interfaz es asi o no o debiera dejar solo una interfaz para todas las tablas ???? ademas si por ejemplo ingreso una usuario y una venta son cosas distintas no me serviria esa interfaz???ç

bueno y lo otra duda es que quiero usar mi aplicacion con ibates y spring de antemano graciasl

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Ni por tabla ni uno solo

En mi opinión, el diseño de los DAO debe ir más orientado a encapsular cierta funcionalidad enfocada a una tarea o un módulo de tu sistema o aplicación, sin importar si abarca varias tablas o una sola.

Por ejemplo si tienes un sistema donde hay usuarios en la base de datos y tienes un módulo de foros, puedes tener un DAO que maneja solamente los usuarios y otro que maneja lo de los foros, pero el DAO de foros va a manejar varias tablas a final de cuentas (la de foro, la de comentario, la relación entre usuarios y foros, entre usuarios y comentarios).

Por qué quieres crear un pool de conexiones por código? Precisamente es de las cosas donde Spring te facilita la vida, porque además se vuelve más fácil que si empiezas usando por ejemplo Apache DBCP y a la mera hora quieres cambiar a C3P0 lo puedes hacer sin teclear una sola línea de código (revisa ambas ligas que puse en este párrafo para que veas cómo crear un pool con ambas librerías).

Spring tiene soporte para iBatis, revisa la documentación de Spring para ver cómo configurar iBatis con Spring.

Amigo Mio:

Gracias por responderme una consulta

si tengo esto, con spring
[code]
####################################
# Database Connectivity Properties
####################################

#Parametros de la conexion
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@172.55.55.555:1521:BASEDEDATOS
username=usuario
password=12345

#Tamaño inicial del pool, es decir, nuemero de conexiones iniciales
initialSize=5

#Maximo numero de conexiones que pueden estar activas al mismo tiempo
maxActive=10

#Maximo numero de conexiones que pueden estar en estado Idle
maxIdle=3

#Minimo numero de conexiones que pueden estar en estado Idle
minIdle=1

#Tiempo maximo de espera para obtener una conexion
maxWait=5000

#Indica el estado de las conexiones antes de repartirlas desde el pool
defaultReadOnly=false

#Consulta para validar las conexiones del pool. Tiene que ser una consulta SELECT y devolver al menos una fila
#Sería mejor hacer una consulta de alguna tabla propia de la BBDD
validationQuery=SELECT SYSDATE FROM DUAL

#Indica si las conexiones son validas antes de pedirselas al pool
testOnBorrow=true

[/code]

luego llamo desde el xml
[code]
<?xml version="1.0" encoding="UTF-8"?>

dataBase.properties

${driver}

${url}

${username}

${password}

${initialSize}

${maxActive}

${maxIdle}

${minIdle}

${maxWait}

${defaultReadOnly}

${validationQuery}

${testOnBorrow}

classpath:/sql-map-config-oracle.xml

[/code]

luego esto esta siendo el pool de conexiones con spring mas ibates , la pregunta mia dice que va esperar 5000 sungo que en milesegundo , luego antes de ejecutarse la proxima conexion que pasa si despuedes de este tiempo falla la conexion, quien manejo eso spring?? como se captura la excepcion si ocurre , y como puedo caputara la excepcion si el ficho xml no esta??

Imagen de ezamudio

Spring - DBCP - iBatis

Con Spring estás configurando el BasicDataSource de DBCP, así como el mapa de iBatis. Luego en tu DAO usas el BasicDataSource para conectarte a la base de datos y el mapa de iBatis supongo para todo el manejo de las entidades. Sin ver el código no puedo saber más pero supongo que realmente pues no hay un overlap de funcionalidad y por lo tanto las conexiones a base de datos serán manejadas todas por el BasicDataSource.

Spring en este caso solamente está creando y conectando esos beans para ti; no se mete en cómo funciona cada uno. Tu pregunta de los 5000 me parece que es acerca de la propiedad maxWait del BasicDataSource; ahí estás indicando que el BasicDataSource debe esperar hasta 5 segundos (5000 milisegundos) en caso de que no haya conexiones disponibles, para ver si alguien devuelve una.

Los pools de conexiones son para optimizar recursos (las conexiones a base de datos) en aplicaciones concurrentes (como una aplicación web por ejemplo). En este caso lo que estás configurando en el BasicDataSource es que al inicio (al crearse el BasicDataSource), va a crear 5 conexiones a la base de datos, aunque luego le pusiste que máximo guarde 3 conexiones al estar inactivas y que siempre debe tener al menos 1 conexión inactiva disponible. Como máximo va a tener 10 conexiones activas.

En este contexto, una conexión inactiva o idle es la que el pool (el BasicDataSource) ha creado hacia la base de datos y está lista para usarse pero nadie por el momento la ha usado, así que está disponible para quien se la pida. Una conexión activa es una que el pool entregó porque algún objeto de la aplicación la solicitó. Cuando dicho objeto devuelva la conexión al pool, se considera nuevamenteidle.

Puede llegar un momento en que todas las conexiones que tiene el pool se encuentren activas; si en ese momento otro objeto pide una conexión, pueden pasar dos cosas dependiendo de cómo se haya configurado: si todavía puede crear más porque las conexiones activas son menos que las indicadas en maxActive, el pool simplemente crea una nueva conexión y la devuelve. Pero si por ejemplo ya hay 10 conexiones activas y en este caso maxActive=10, ya no puede crear más, por lo que en ese momento se espera a que una de las conexiones activas sea devuelta al pool, para entregarla al que recién pidió una. Como máximo va a esperar 5 segundos. Si en menos de 5 segundos (digamos 1 segundo) alguien devuelve una conexión, entonces se entrega al que la está esperando. Pero si a los 5 segundos no se ha liberado ninguna conexión entonces se arroja una excepción (no recuerdo cuál pero todo eso viene en la documentación de DBCP).

Si estás usando el soporte de Spring para iBatis entonces muy probablemente la excepción será convertida por los componentes de Spring, en una subclase de DataAccessException, que como todas las excepciones que maneja Spring, es en tiempo de ejecución (subclase de RuntimeException), para que puedas capturarla en donde realmente la vas a manejar (eso depende de tu aplicación).

El "ficho xml" supongo que te refieres al XML de iBatis? si no existe, se va a arrojar una excepción, no sé de qué tipo, pero a fin de cuentas va a causar que no se pueda configurar el application context y por lo tanto se arrojará una excepción en donde se está creando; si es una aplicación web y el app context se crea desde el web.xml entonces la aplicación no va a levantar, se arrojará una cadena muy larga de excepciones pero la causa original será que ese archivo no se pudo encontrar. Lo mismo pasa si Spring no encuentra el XML de beans que muestras en tu post.

ERES UN GRAN TIPO GRACIAS

y lo ultimo por ahora

cuando uno en el principal y en pruebas en la mayoria de los casos he visto que desde spring lo hacen asi

ClassPathXmlApplicationContext ctx= new ClassPathXmlApplicationContext("applicationContextSpringIbates.xml");

luego puedo en dos clases hacer un new de ese contexto o solamente es uno solo???
es decir puedo hacer esto
Principal llama a clase a y clase b
luego clase a llama contexto... classPath..
luego clase b llama contexto... ClassPath

Es posible???

o debo tener un sola instancia de classPath en spring ??

de antemo Gracias.

Imagen de ezamudio

ApplicationContext

Puedes tener varios applicationContexts distintos. Sin embargo lo más común es que se utiliza uno solo. Spring te facilita la configuración y conexión de todos los componentes de tu aplicación, pero lo ideal es que tu código no dependa mucho de Spring. Por lo tanto lo mejor es que tengas configurado en el ApplicationContext algún componente que sea el que arranca el programa, una vez que tiene todo configurado. De esa manera, solamente necesitas ponerle en el main algo como esto:

public static void main(String[] args) {
  ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("mi_contexto.xml");
  Runnable r = (Runnable)ctx.getBean("main");
  r.run();
}

De ese modo, implementas Runnable en tu componente principal (puede ser el mismo que tiene el main estático) y en el método run() es donde ya inicias tu aplicación. Suponiendo que sea una clase llamada Principal la que contiene este código (o sea tu componente principal es clase Principal) y necesita referencias a objetos de clase A y clase B, eso lo conecta Spring, pero ya no tienes que usar el application context de manera directa para nada más. Todas las conexiones entre componentes se manejaron en la configuración del ApplicationContext, ya sea por puro XML o utilizando adicionalmente las anotaciones como @Autowired, @Resource, etc.

otra consulta y disculpa

tengo lo siguiente
Estoy haciendo lo siguiente Flex para capa presentacion
Spring + java capa logica
Mysql+ibates capa persistrencia

Ya que en la version 2 y pico eleminaron todo lo relacionado con DAO y dejaron tanto el dao como la implementacion del factory a spring , en donde debo declarar la si quiero por ejemplo realizar lo siguiente , supongamos tengo

public void insertar(Objecto algo){
dao.buscar(algo)
dao.insertar(algo)

}

ya que eso es una transaccion donde debo declar eso en el archivo xml de spring???
y lo otro el sql map config de ibates al crear setting me lo rechaza en donde debo declarar por ejemplo lo siguiente
fetchSize
lazyLoadingEnable

y una series de opciones si estas opciones son parte de ibates que pueden usarse ahora que estoy integrando con spring
en donde se declarar en el archivo database.propiertes o en el archivo de configuracion de spring????

por lo anterior y este muchas gracias.

Imagen de ezamudio

@Transactional

No he usado iBatis para desarrollos reales, así que no puedo contestarte varias de tus dudas. Pero en la config de Spring puedes declarar un manejador de transacciones que detecte la anotación @Transactional en los métodos de tus DAOs y componentes manejados por Spring, con lo que va a crear una transacción para ejecutar dichos métodos y terminando su ejecución hace commit (o si se arroja alguna excepción, hace rollback). De modo que tu código solamente necesita:

@Transactional
public void insert(Object algo) {
  dao.buscar(algo);
  dao.insertar(algo);
}

Y en la config de Spring va algo así:

<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans <a href="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
" title="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
">http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
</a>            <a href="http://www.springframework.org/schema/context" title="http://www.springframework.org/schema/context">http://www.springframework.org/schema/context</a> <a href="http://www.springframework.org/schema/context/spring-context-2.5.xsd
" title="http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
http://www.springframework.org/schema/context/spring-context-2.5.xsd
</a>            <a href="http://www.springframework.org/schema/tx" title="http://www.springframework.org/schema/tx">http://www.springframework.org/schema/tx</a> http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- este es para cachar las anotaciones @Autowired, @Resource, @Required, etc -->
<context:annotation-config />

<!-- este es para procesar los métodos que traen anotación @Transactional -->
<tx:annotation-driven />

<bean id="miDao" class="org.miproyecto.dao.MiDao">
  <property name="dataSource" name="algunDataSource" />
</bean>

</beans>

Lee la documentación de Spring, está bastante completa y ahí te explican las minucias de usar @Transactional y los PlatformTransactionManagers que trae Spring (seguramente para iBatis será un DataSourceTransactionManager, a menos que iBatis traiga su propio TransactionManager así como Hibernate).

GRACIAS

GRACIAS