Intentando arrojar un poco de luz a problemas que puedes encontrarte. Especialmente con PostgreSql
lunes, 28 de septiembre de 2015
Hibernate join con condición adicional
Puede que tengamos escrito en HQL, sentencias que realizan joins de nuestras entidades. La ventaja de Hibernate es que como conoce las dependencias, no tenemos que indicar la condición del join entre cada una de nuestras tablas.
Por ejemplo
from Cat as cat
join cat.mate as mate
left join cat.kittens as kitten
Pero que ocurre si no queremos que el join nos traiga el contenido de la tabla relacionada, bajo alguna circunstancia que se encuentra en dicha tabla relacionada.
La solución es usar la clausula "with" que se asemeja a un and, y donde podemos especificar la condición que debe cumplirse para que el join sea efectivo y devuelva la fila de la entidad relacionada.
from Cat as cat
left join cat.kittens as kitten
with kitten.bodyWeight > 10.0
jueves, 30 de julio de 2015
Instalación y administración Tomcat 7 en Windows
Instalación
Si quieres instalar Tomcat como ejecutable, no como servicio, en tu máquina windows.
Baja el fichero .zip correspondiente de 32 o 64 bits. Desde https://tomcat.apache.org/download-70.cgi
Descomprimelo en una carpeta. Por ejemplo: c:\tomcat7
Abre una consola de windows.
Establece las variables de entorno donde tengas instalado el jdk
set PATH=%PATH%;C:\Program Files\Java\jdk1.7.0_71\bin
set JAVA_HOME=C:\Archivos de programa\Java\jdk1.7.0_71
Dirigete a c:\tomcat7\bin y ejecuta startup.bat
Y ahora abre un navegador con la dirección: http:\\localhost:8080
Voila!
Si quieres parar Tomcat, en la misma consola de windows donde ejecutaste startup.bat, solo tienes que ejecutar shutdown.bat
Consola de administración
Edita el fichero c:\tomcat7\conf\tomcat-users.xml para que tenga la forma:
Accede a la siguiente dirección y cuando pida contraseña utiliza la definida en el anterior fichero:
http://localhost:8080/manager
Ampliación de memoria
Si tienes problemas de memoria al arrancar las aplicaciones, tienes que crear un fichero con nombre setenv.bat en el directorio c:\tomcat7\conf
set "CATALINA_OPTS=%CATALINA_OPTS% -Dfile.encoding=UTF8 -Xmx2048m -XX:MaxPermSize=512m"
Cambio de Puerto
Editar el fichero c:\tomcat\conf\server.xml cambiar el puerto 8080 por ejemplo por el 7001:
< Connector port="7001" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
Si además queremos tener dos tomcat arrancados en la misma máquina habremos de cambiar el puerto 8005 y el puerto 8009:
< Server port="8015" shutdown="SHUTDOWN" />
....
< Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />
redirectPort="8443" />
Si además queremos tener dos tomcat arrancados en la misma máquina habremos de cambiar el puerto 8005 y el puerto 8009:
< Server port="8015" shutdown="SHUTDOWN" />
....
< Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />
martes, 21 de abril de 2015
Java. Guardar una cadena en un fichero
En un proyecto Java, componía un xml a traves de una serie de consultas las cuales necesitaban un tiempo de proceso muy largo.
Para mejorar el rendimiento y devolver el xml si no había habido cambios en las tablas relacionadas, puede servir una caché primitiva como esta. Un método guarda el string del xml en un fichero y otro método lo lee y lo devuelve.
Para mejorar el rendimiento y devolver el xml si no había habido cambios en las tablas relacionadas, puede servir una caché primitiva como esta. Un método guarda el string del xml en un fichero y otro método lo lee y lo devuelve.
private void GuardarXmlCache ( String nombreFichero, String xml) {
try(FileOutputStream fos=new FileOutputStream(nombreFichero)){
fos.write(xml.getBytes());
fos.close();
}catch(IOException e){
}
}
private String LeerXmlCache ( String nombreFichero) {
FileInputStream fos = null;
String message = new String();
try {
fos=new FileInputStream(nombreFichero);
BufferedReader rd = new BufferedReader (new InputStreamReader(fos,"UTF-8"));
String line=null;
//final StringBuffer buffer = new StringBuffer(2048);
while ((line = rd.readLine()) != null) {
message += line;
}
rd.close();
}catch(IOException e){
e.printStackTrace();
}
return message;
}
jueves, 19 de febrero de 2015
analizando consultas en Postgresql. Parte I
Tenemos una potente herramienta para analizar las consultas en PostgreSQL: explain analyze
explain analyze select * from usuario; Seq Scan on usuario (cost=0.00..4743.71 rows=44471 width=243) (actual time=0.026..59.431 rows=44474 loops=1) Total runtime: 63.645 ms (2 filas)
Seq Scan, significa que la consulta se hará fila a fila secuencialmente sin acceso por índice.
El valor numérico cost=0,00, es el tiempo que tiene que esperar la consulta en ser ejecutada. En este caso el tiempo es 0.00 porque puede ejecutarse inmediatamente.
El segundo valor 4743,71, es el numero de fetches necesarios para recuperar todas las filas de la consulta, el número de fetches lo podemos minimizar por ejemplo aplicando LIMIT.
Rows=44.471 es el número de filas que devolverá la consulta y width el tamaño medio en bytes de cada fila.
Truco: si vas a realizar análisis de operaciones de escritura, encierralas en un bloque de transacción, para poder ejecutarlas las veces que necesites y que no se produzcan cambios en la base de datos:
begin; explain analyze insert ...; rollback;
Etiquetas:
optimización,
postgres,
postgresql,
tuning
lunes, 15 de diciembre de 2014
Usuario de solo lectura
A veces puedes necesitar dar acceso a tu base de datos a una herramienta de terceros, de la cual no te fias o solo quieres que haga consultas pero no toque nada. Una forma rápida es crear un usuario de solo lectura:
create user 'readonly' password 'laquesea';
alter user readonly set default_transaction_read_only = on;
Luego puedes darle permiso sobre todas las tablas de los esquemas que necesites:
select 'grant select on ' || a.schemaname || '.' || a.tablename || ' to readonly;' from pg_tables a where schemaname in ('esquema1');
select 'grant select on ' || a.schemaname || '.' || a.tablename || ' to readonly;' from pg_tables a where schemaname in ('esquema2');
Y por último dale permisos de acceso a los esquemas:
grant usage on schema cromos to readonly;
grant usage on schema coleccion to readonly;
create user 'readonly' password 'laquesea';
alter user readonly set default_transaction_read_only = on;
Luego puedes darle permiso sobre todas las tablas de los esquemas que necesites:
select 'grant select on ' || a.schemaname || '.' || a.tablename || ' to readonly;' from pg_tables a where schemaname in ('esquema1');
select 'grant select on ' || a.schemaname || '.' || a.tablename || ' to readonly;' from pg_tables a where schemaname in ('esquema2');
Y por último dale permisos de acceso a los esquemas:
grant usage on schema cromos to readonly;
grant usage on schema coleccion to readonly;
lunes, 6 de octubre de 2014
Bloque anónimo
A veces necesitas hacer uso de las estructuras de plpgsql, por ejemplo, en scripts .sql que llamas desde tareas del cron, etc. Para ello tenemos los bloques DO.
A continuación un bloque sencillo, que comprueba si es primeros de mes y añade un mes de antigüedad a los usuarios registrados. Como puedes ver podemos utilizar variables y ejecutar comandos de los cuales no necesito conocer el resultado (perform).
do $$
declare
dia integer;
begin
select extract ('day' from current_date) into dia from editorial;
if dia = 1 then
perform 'update usuario set months=months+1';
else
raise notice 'Hoy no es día 1';
end if;
end$$;
A continuación un bloque sencillo, que comprueba si es primeros de mes y añade un mes de antigüedad a los usuarios registrados. Como puedes ver podemos utilizar variables y ejecutar comandos de los cuales no necesito conocer el resultado (perform).
do $$
declare
dia integer;
begin
select extract ('day' from current_date) into dia from editorial;
if dia = 1 then
perform 'update usuario set months=months+1';
else
raise notice 'Hoy no es día 1';
end if;
end$$;
martes, 12 de agosto de 2014
Cambiar atributos default o not null a una columna existente
Si quieres quitar la propiedad default o not null a una columna existente;
alter table alter column drop not null;
alter table alter column drop default;
Por el contrario, si quieres añadir el atributo not null o la propiedad default:
alter table alter column set not null;
alter table alter column set default current_timestamp;
alter table
alter table
Por el contrario, si quieres añadir el atributo not null o la propiedad default:
alter table
alter table
Suscribirse a:
Entradas (Atom)