Foro sobre Java SE > Experiencia con Java
Hola, pues el tema que expones es un poco complejo, ya que son múltiples los factores que pueden afectar a la velocidad en la que los datos se almacenan en la bbdd.
1.- ¿Servidor de BBDD y aplicación se encuentran en la misma maquina, o en maquinas distintas, misma red o distinta red?
- Si la maquina es la misma, el acceso a la bbdd es mas rápido.
- Si están en maquinas diferentes ya se relentiza un poco.
- En la misma red acceso mas rápido.
- En redes distintas, mas lento.
2.- ¿El servidor donde esta la aplicación y, o la bbdd, tiene recursos suficientes o es una maquina antiguilla con poca ram a la que le cuesta tirar?
-Si tiene/n recursos suficientes, el acceso a la base de datos debe ser mas rápido.
-Si en cambio son maquinas viejas, pues obviamente irán mas lentas a la hora de acceder a los datos.
3.- ¿Son muchos datos los que se almacenan, no es lo mismo almacenar 6 o 7 columnas en 1 tabla, que almacenar 40 o 50 columnas en una tabla, otras 10 o 20 en otra tabla y asi?
-Mientras mas datos se almacenen, mas lenta sera la ejecución.
Lo anterior es en cuanto a infraestructura, equipamiento y datos.
Lo siguiente debería hablarlo con quien desarrollo la aplicación, ya que dependiendo del diseño y demás, pues los accesos a bbdd serán mas lentos, o llevaran mas tiempo.
Por ejemplo el ORM del que hablas tarda mucho en crear un objeto que es el EntityManagerFactory, ese objeto tarda varios segundos en cargarlo dependiendo de las clases de persistencia que tengamos, Yo por ejemplo tengo aqui un proyecto con 4 clases de persistencia y me tarda 4 segundos en cargar ese objeto que te digo. Si tienes mas pues tardara mas, porque tiene que leer la info de todas esas clases para poder comenzar a trabajar.
Normalmente, lo que se suele hacer, es crear un objeto de este tipo cuando se inicia la aplicación, durante la carga inicial, y ya mantenerlo vivo durante todo el tiempo que la aplicación esté en ejecución. Con esto te quiero decir que si el que desarrollo tu aplicación, Crea y destruye este objeto cada vez que va a realizar una operación a la base de datos, pues es muy posible que los accesos a base de datos se relenticen mucho, y cuando dices 5 segundos de promedio, a mi me parece mucho.
Y con JDBC Ocurre lo mismo, si cada vez que vas a realizar una operación sobre la bbdd abres y cierras la conexión, pues, cada vez que abres la conexión, tb relentiza el acceso. Se suele optar como anteriormente, se abre una conexión inicial y se mantiene abierta mientras dura la ejecución de la aplicación.
Con lo que me has descrito y sin ver nada mas, estas pueden ser las conclusiones, jeje me cogiste con ganas de escribir. Espero que te sea útil. Un saludo y suerte con que te lo arreglen.
"... la aplicación en Java demora 5 segundos en promedio, mi proveedor me indica que ya no se puede mejorar nada más porque es como maneja en JDBC"
Tu proveedor no sabe usar JBDC, o Java, o ambas a la vez. Así de simple.
He llegado a ver barbaridades tales como:
- acceder a bases de datos desde listeners de Swing, como si tal cosa
- redibujar componentes de Swing con accesos a bases de datos desde renderers
- ignorar sistemáticamente las más elementales recomendaciones de diseño relativas a la multitarea con Swing
Todo esto aparte de los atinados comentarios de loderain.
Muchas gracias loderain y choces por sus comentarios.
Con respecto a los temas de infraestructura no tengo problemas porque son servidores virtualizados que se encuentran en la misma red,con 16 cores y 64GB de memoria tanto para la aplicación como la BD.
En aplicaciones transaccionales es recomendable usar un ORM tipo Hibernate? Qué recomiendan?
Voy a comentar a mi proveedor sus comentarios para que revise bien la aplicación y logre mejorarlos.
Sin animos de quitarles más tiempo del que les quité, les copio el log de carga de login de mi aplicación, demora 56 segundo en aparecer la ventana de login, me parece demasiado y por ello los usuarios critican la nueva aplicación.
C:\inter\ptoVentaFe>java -Djnlp.dbPropertiesPath=C:\inter\ptoVentaFe -Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512m -cp lib/* com.interforest.ptovta.pst.Main
2016-12-14 09:15:42,422 [main] INFO Main [] - Punto Venta Versi¾n: 3.0.0
2016-12-14 09:15:42,469 [main] INFO DbConfigurator [] - Windows user:Administrador user2:Administrador
2016-12-14 09:15:42,469 [main] INFO DbConfigurator [] - Prediction Info: Enable:<0> Url Similar:http://192.168.7.9:7090 Url Complementario:http://192.168.7.9:7100 Url Cliente Recomendacion:http://192.168.7.9:7080
2016-12-14 09:15:42,469 [main] INFO DbConfigurator [] - Database:jdbc:sqlserver://192.168.7.12:1433;databaseName=EXACTUS6
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:HP LaserJet Pro MFP M127fn (2 redireccionado)
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:Microsoft XPS Document Writer (2 redireccionado)
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:NPI01BC98 (HP LaserJet 400 MFP M425dn) (2 redireccionado)
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:EPSON9FF38A (L455 Series) (2 redireccionado)
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:EPSON585941 (M105 Series) (2 redireccionado)
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:Fax (2 redireccionado)
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:SQL1 Oficinas 2do Piso en FSRIFOREST (2 redireccionado)
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:Microsoft XPS Document Writer
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:EPSON FX-890 ESC/P
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:CHO1 Caja
2016-12-14 09:15:42,515 [main] INFO Main [] - Print Service:\\FSRIFOREST\SQL1 Oficinas 3er Piso
2016-12-14 09:15:44,156 [main] INFO Main [] - Connecting to schema:INTER14
2016-12-14 09:15:44,156 [main] INFO Main [] - BannerPath:C:\inter\ptoVentaFe/banner_pedido.jpg
dic 14, 2016 9:15:44 AM org.jdesktop.application.ResourceManager getApplicationResourceMap
ADVERTENCIA: getApplicationResourceMap(): no Application class
2016-12-14 09:15:44,844 [AWT-EventQueue-0] INFO ApplicationBase$1[] - Refreshing com.aw.core.spring.ApplicationBase$1@34b97789: startup date [Wed Dec 14 09:15:44 COT 2016]; root of context hierarchy
2016-12-14 09:15:44,969 [AWT-EventQueue-0] INFO XmlBeanDefinitionReader[] - Loading XML bean definitions from URL [jar:file:/C:/inter/ptoVentaFe/lib/com.aw.core.aw-framework-core-dao-2.0.1-SNAPSHOT.jar!/appCtx/appctx-configuration.xml]
2016-12-14 09:15:45,078 [AWT-EventQueue-0] INFO XmlBeanDefinitionReader[] - Loading XML bean definitions from URL [jar:file:/C:/inter/ptoVentaFe/lib/com.aw.core.aw-framework-core-dao-2.0.1-SNAPSHOT.jar!/appCtx/appctx-dao-integrator.xml]
2016-12-14 09:15:45,344 [AWT-EventQueue-0] INFO XmlBeanDefinitionReader[] - Loading XML bean definitions from URL [jar:file:/C:/inter/ptoVentaFe/lib/ptovta-swing-1.0.0-SNAPSHOT.jar!/appCtx/app-jrcp.xml]
2016-12-14 09:15:45,469 [AWT-EventQueue-0] INFO XmlBeanDefinitionReader[] - Loading XML bean definitions from URL [jar:file:/C:/inter/ptoVentaFe/lib/ptovta-server.jar!/spring/applicationContext.xml]
2016-12-14 09:15:53,578 [AWT-EventQueue-0] INFO XmlBeanDefinitionReader[] - Loading XML bean definitions from URL [jar:file:/C:/inter/ptoVentaFe/lib/ptovta-server.jar!/spring/applicationContext-datasource.xml]
2016-12-14 09:15:54,406 [AWT-EventQueue-0] INFO XmlBeanDefinitionReader[] - Loading XML bean definitions from URL [jar:file:/C:/inter/ptoVentaFe/lib/ptovta-server.jar!/spring/applicationContext-ws.xml]
2016-12-14 09:16:03,908 [AWT-EventQueue-0] INFO stPersistenceUnitPostProcessor[] - BD ESQUEMA def:INTER14
2016-12-14 09:16:03,908 [AWT-EventQueue-0] INFO tainerEntityManagerFactoryBean[] - Building JPA container EntityManagerFactory for persistence unit 'ptovta1'
2016-12-14 09:16:03,987 [AWT-EventQueue-0] INFO LogHelper[] - HHH000204: Processing PersistenceUnitInfo [ name: ptovta1 ...]
2016-12-14 09:16:04,159 [AWT-EventQueue-0] INFO Version[] - HHH000412: Hibernate Core {5.1.0.Final}
2016-12-14 09:16:04,159 [AWT-EventQueue-0] INFO Environment[] - HHH000206: hibernate.properties not found
2016-12-14 09:16:04,159 [AWT-EventQueue-0] INFO Environment[] - HHH000021: Bytecode provider name : javassist
2016-12-14 09:16:04,252 [AWT-EventQueue-0] INFO Version[] - HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2016-12-14 09:16:05,503 [AWT-EventQueue-0] INFO Dialect[] - HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
2016-12-14 09:16:07,910 [AWT-EventQueue-0] INFO Version[] - Hibernate Validator 4.0.2.GA
2016-12-14 09:16:07,926 [AWT-EventQueue-0] INFO DefaultTraversableResolver[] - Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
2016-12-14 09:16:15,163 [AWT-EventQueue-0] INFO ueryTranslatorFactoryInitiator[] - HHH000397: Using ASTQueryTranslatorFactory
2016-12-14 09:16:25,571 [AWT-EventQueue-0] INFO ReflectionServiceFactoryBean[] - Creating Service {http://tempuri.org/}IServiceService from class com.interforest.ptovta.server.fe.ws.IService
2016-12-14 09:16:38,142 [AWT-EventQueue-0] INFO TimeObserver[] - setting backBean(ms)0
2016-12-14 09:16:38,221 [AWT-EventQueue-0] INFO TimeObserver[] - setting backBean(ms)0
2016-12-14 09:16:38,361 [AWT-EventQueue-0] INFO TimeObserver[] - register InputProviders(ms)0
2016-12-14 09:16:38,377 [AWT-EventQueue-0] INFO TimeObserver[] - register Binding(ms)16
2016-12-14 09:16:38,377 [AWT-EventQueue-0] INFO TimeObserver[] - executing automaticBinding(ms)0
2016-12-14 09:16:38,377 [AWT-EventQueue-0] INFO TimeObserver[] - register Binding(ms)0
2016-12-14 09:16:38,377 [AWT-EventQueue-0] INFO TimeObserver[] - register GridProviders(ms)0
2016-12-14 09:16:38,377 [AWT-EventQueue-0] INFO TimeObserver[] - register validations(ms)0
2016-12-14 09:16:38,377 [AWT-EventQueue-0] INFO TimeObserver[] - Configuring the Presenter elements(ms)16
2016-12-14 09:16:38,377 [AWT-EventQueue-0] INFO TimeObserver[] - Configuring the Presenter actions(ms)0
2016-12-14 09:16:38,377 [AWT-EventQueue-0] INFO SecurityManager[] - SECURITY IS DISABLED.
2016-12-14 09:16:38,393 [AWT-EventQueue-0] INFO LoginPst[] - Initializing binding
2016-12-14 09:16:38,393 [AWT-EventQueue-0] INFO TimeObserver[] - Executing validatorBuilder(ms)0
2016-12-14 09:16:38,393 [AWT-EventQueue-0] INFO TimeObserver[] - Initializing the Components Presenter(ms)16
2016-12-14 09:16:38,408 [AWT-EventQueue-0] INFO TimeObserver[] - Setting values BEAN --> JComponents(ms)15
2016-12-14 09:16:38,408 [AWT-EventQueue-0] INFO TimeObserver[] - iniciar presenter(ms)47
2016-12-14 09:16:38,424 [AWT-EventQueue-0] WARN IPView[] - Component pnlToolBar does not exist incom.interforest.ptovta.pst.login.FrmLogin@298438ca
2016-12-14 09:16:38,424 [AWT-EventQueue-0] INFO ProcessMsgBlocker[] - UnBlockuser input
2016-12-14 09:16:38,518 [AWT-EventQueue-0] WARN HeaderPanel[] - 'jar:file:/C:/inter/ptoVentaFe/lib/com.aw.core.aw-framework-core-jrcp-2.0.1-SNAPSHOT.jar!/images/title-close-x.png'
2016-12-14 09:16:38,580 [AWT-EventQueue-0] INFO ProcessMsgBlocker[] - UnBlockuser input
2016-12-14 09:16:38,596 [AWT-EventQueue-0] INFO TimeObserver[] - Executing basic validations (ms)0
2016-12-14 09:16:38,596 [AWT-EventQueue-0] INFO TimeObserver[] - Initializing the View(ms)172
2016-12-14 09:16:38,596 [AWT-EventQueue-0] INFO TimeObserver[] - Show Dialog(ms)0
2016-12-14 09:16:38,971 [AWT-EventQueue-0] INFO AWWindowsManager[] - Setting Pst Active:class com.interforest.ptovta.pst.login.LoginPst
"Después de tanto insistir el proveedor dejó de usar el ORM"
Pues te ha engañado, o ese log es más antiguo.
¿El POS usa Swing?
El proveedor me dice que en algunos casos usa el ORM y en otras operaciones que demoran dice que lo dejo de usar, pero yo noto que igual se demora.
El log es actual.
El POS si usa Swing.
¿Tienes las fuentes de la aplicación?
Si es así, ¿podrías publicar algo de ese código?.
Bastaría con alguna clase que actualice un componente de Swing que lea datos desde la BD, y cómo conecta con la BD.
Tengo la sospecha -entre otras- de que cada vez que realiza una operación con la BD, usa el Driver Manager sistemáticamente, como ejemplo de "hacer una aplicación lenta".
Justo hoy recibí este articulo, esta muy interesante.
http://www.sqlservercentral.com/articles/Hibernate/148907/
Ahora conseguiré las fuentes para compartirlo.
Gracias!
Hace unos meses mandé a desarrollar una aplicación de ventas POS en Java, reemplazando a otro que estaba desarrollado en Gupta Centura, con la idea de obtener un sistema flexible y rápido, con mucha expectativa esperé la aplicación hasta que la tuve para pruebas.
En pruebas, con las mejoras funcionales, ví que la aplicación demoraba al cargar la pantalla de logueo y las operaciones que interactuan con la base de datos demoran tres veces más de lo que demora en la antigua aplicación. Para ello solicité a mi proveedor que revise la aplicación porque la velocidad ha empeorado comparado con la aplicación antigua a lo que el proveedor me responde que por el uso de un ORM como hibernate la aplicación se hace lenta.
Después de tanto insistir el proveedor dejó de usar el ORM, sin embargo la mejora es casi imperceptible, una operación de grabado en BD en mi antiguo sistema demora, 1.5 segundos y en la aplicación en Java demora 5 segundos en promedio, mi proveedor me indica que ya no se puede mejorar nada más porque es como maneja en JDBC.
Realmente no estoy muy contento con la respuesta y dudo que en Java los sistemas sean lentos, sino nadie los usará.
Agradecería me puedan comentar según su experiencia si realmente las soluciones en Java conectadas a BD demoran mucho más comparado a aplicaciones en .Net o cualquier otro lenguaje de programación.
Gracias.