Dominio en venta pamapatec.com. Contactarse con a través de http://www.rodrigoasensio.com/contacto/ o al email rasensio [at] gmail com
Dominio en venta pamapatec.com. Contactarse con a través de http://www.rodrigoasensio.com/contacto/ o al email rasensio [at] gmail com
En el día de hoy vamos a ver algunos tips o mejroes prácticas para JDBC.
Siempre que se pueda es mejor utilizar drivers tipo 4 ya que ésta arquitectura encapsula enteramente la implementacion de la API de JDBC incluyendo la lógica de comunicación directa con la base de datos utilizando solo 1 driver. Permite que el driver sea pequeño y conciso además de ser 100% java.
Hoy en día cualquier aplicación seria debe utilizar un pool de conexiones a base de datos. Esta reduce el tiempo de creación y la utilización de recursos de la máquina. Apache DBCP es una utilidad muy popular para poder hacer pooling.
Si es por optimizar también podemos optimizar la creación de PreparedStatement en java alojandolos en un pool de statements el cual está diponible recien en JDBC 3.0
connection.setAutoCommit(false);
Por default Java deja autocommit encendido, lo cual genera una transacción por cada SQL o DDL que viaja a la base de datos. En cada transacción hay una utilización de recursos del sistema en la base de datos mucho mayor a que si no la hubiese. Evaluando tu aplicación podrías hacer delay de el commit de una transacción lo más posible para optimizar recursos.
La utilización de addBatch() ayuda a ejecutar varias operaciones similares reduciendo el tráfico por la red enviando solo 1 paquete en vez de tantos como inserts quieras hacer.
Siempre pero siempre utilizar SELECT column1, column2, etc, nunca Select * porque esto va a hacer 2 lecturas en la base de datos, 1 para ver que columnas tiene la tabla X y otro el mismo SELECT. Además tambien evitaríamos traer datos innecesarios que lo único que van a hacer es generar más tráfico de red.
Bastante simple este snippet para algo que no es nativo de Java. Java no permite borrar un directorio que contenga archivos adentro. Lo primero que hay que hacer para eliminar el directorio es simplemente eliminar los archivos interiores. Aca un snippet que se llama recursivamente.
public boolean deleteDirectory(File directory) {
File[] files = directory.listFiles();
for(int i = 0; i < files.length; i++) {
if(files[i].isDirectory()) {
this.deleteDirectory(files[i]);
} else {
files[i].delete();
}
}
return path.delete();
}
Soy nuevo en el tema PHP, estoy aprendiendo bastante este último mes ya que un cliente prefirió utilizar ese lenguage sobre Java. Anoche me encontré con un problema cuando estaba tratando de hacer un simple insert en la base de datos a mano. Me dí cuenta que en la tabla habían caracteres ilegibles en otros records que no habia hecho insert a mano. Esos records eran provenientes de la aplicación PHP. Que paso ? Aparentemente (quiza me equivoque) el default charset de PHP PDO es ISO-8859-1.
Para solucionar esto facilmente pasamos un parámetro más cuando generamos una conexión PDO desde PHP:
$connectionString = "mysql:host=localhost;dbname=basex"; $params = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); $connection = new PDO($connectionString, "user", "password", $params);
Eso solucionó mi problema de inserts, ahora lo que hago insert lo puedo ver perfectamente sin caracteres raros en la consola mysql.
Ahora la segunda parte del problema fue hacer los queries y que devuelvan caracteres decentes. En mi caso uso Ajax > JSON. Y obviamente venian caracteres extraños. Lo que hice fue utilizar la funcion json_encode para parsear los valores que eran string.
Estoy trabajando en un sistema que recibe emails en un Sendmail y este mediante CURL redirecciona a un Tomcat Server para ejecutar comandos. Todo esto es porque lso sres clientes no puden hacer un miserable webservice. Como la verdad shell script no es mi fuerte, opté por redireccionar mediante sendmail alias a un script el cual nuevamente redirecciona usando CURL a una URL.
El shell
#!/bin/sh TEMP_FILE=$(date +%k%M%S%N) URL=http://someserver/somefile #writes to disk the email file while read line; do echo $line >> $TEMP_FILE done curl -F "file=@$TEMP_FILE" $URL #wipes out the temp file rm -rf $TEMP_FILE
A mi aplicación Java viene como si fuera un FileUpload común y corriente dentro de un servlet o simil. Utilizo apache file upload.
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) { // here is the file!
myFile = item;
}
}
// now process the file
Entonces tenemos con el código de arriba solucionado el recibir el archivo proveniente del CURL request. Ese archivo es plain text y contiene toda la info que contiene un email, header y body.
From root@myserver.com Thu May 13 14:21:16 2010 Received: from myserver.com (localhost.localdomain [127.0.0.1]) by myserver.com (8.13.8/8.13.8) with ESMTP id o4DILgiri383703 for; Thu, 13 May 2010 14:21:16 -0400 Received: (from root@localhost) by myserver.com (8.13.8/8.13.8/Submit) id o4DIGIUR89844 for some@otherserver.com; Thu, 13 May 2010 14:21:16 -0400 Date: Thu, 13 May 2010 14:21:16 -0400 From: root To: some@otherserver.com Subject: some subject Message-ID: <20100513182116.GA873@myserver.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.2i here the body of the message
Y aca viene la gran utilidad, para evitar parsear el mensaje y estar luchando con el reply-to, from , y el body construimos un MimeMessage en java el cual nos permite acceder a todos los campos del email sin mayores dolores de cabeza.
Creamos un property y un session para poder pasarlos como parametros al MimeMessage
Properties properties = System.getProperties();
//properties.put("mail.transport.protocol", "smtp"); NO SE SI ES NECESARIO
//properties.put("mail.smtp.host", "localhost"); NO SE SI ES NECESARIO
Session session = Session.getDefaultInstance(properties, null);
Y ahora parseamos el mensaje :D
StringBufferInputStream stream = new StringBufferInputStream(email); MimeMessage message = new MimeMessage(session, stream);
Y podemos acceder a todos los campos del email
message.getSubject(); message.getSender(); message.getSenderDate(); message.getContent(); //blablabla
Utilizo la API de Java Mail. También quiero agradecer a Pedro Prez de Keetup por la ayuda con CURL.