¿Puede la base de datos javaDB (derby) que viene con Java 6 interactuar directamente con jdk sin iniciar el servicio?
Los programadores que hayan instalado JDK 6 recientemente pueden encontrar que además de los directorios tradicionales bin, jre y otros, JDK 6 agrega un nuevo directorio llamado db. Este es el nuevo miembro de Java 6: Java DB. Este es un sistema de gestión de bases de datos (DBMS) de código abierto, puramente implementado en Java, derivado de Derby, un proyecto bajo el nombre de Apache Software Foundation (ASF). Tiene solo 2 MB de tamaño, lo cual es compacto en comparación con bases de datos que pueden alcanzar fácilmente el tamaño G. Pero esto no impide que Derby sea completamente funcional y admita la mayoría de las funciones requeridas por las aplicaciones de bases de datos. Lo que es aún más valioso es que, gracias al fuerte poder comunitario de ASF, Derby ha recibido el apoyo de grandes empresas como IBM y Sun, así como de destacados programadores de todo el mundo. No es de extrañar que Sun haya elegido su versión 10.2.2 para incluirla en JDK 6 como una base de datos integrada. Esto es como inyectar nueva vitalidad al JDK: los programadores de Java ya no necesitan gastar mucha energía instalando y configurando la base de datos para realizar una programación de base de datos segura, fácil de usar, estándar y gratuita. En este capítulo, echaremos un primer vistazo al mundo de Java DB y exploraremos cómo usarlo para escribir programas ricos en funciones.
Hola, Java DB: Derby en modo integrado
Ahora que tenemos una base de datos integrada (integrada), comencemos con un ejemplo simple e intentemos usarlo. Este programa hace lo que la mayoría de las aplicaciones de bases de datos podrían hacer: crea una base de datos llamada helloDB en el DBMS; crea una tabla de datos llamada hellotable; luego, consulta los datos y finalmente imprime los resultados en la consola; elimine la tabla y la base de datos para liberar recursos.
clase pública HelloJavaDB {
public static void main(String[] args) {
prueba { // carga el controlador
Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
System.out.println("Cargue el controlador integrado");
Conexión conn = null;
Propiedades props = new Propiedades();
props.put("usuario", "usuario1"); props.put("contraseña", "usuario1"); );
//crea y conecta la base de datos llamada helloDB
conn=DriverManager.getConnection("jdbc:derby:helloDB;create=true", props);
System.out.println("create and connect to helloDB");
conn.setAutoCommit(false);
// crea una tabla e inserta dos registros p> p>
Declaración s = conn.createStatement();
s.execute("crear tabla hellotable(nombre varchar(40), puntuación int)");
System .out.println("Tabla creada hellotable");
s.execute("insertar en valores hellotable('Ruth Cao', 86)");
s. ejecutar( "insertar en valores hellotable ('Flora Shi', 92)");
// enumera los dos registros
ResultSet rs = s.executeQuery(
"SELECCIONAR nombre, puntuación DE hellotable ORDENAR POR puntuación");
System.out.println("namettscore");
while(rs.next()) {
Constructor StringBuilder = new StringBuilder(rs.getString(1));
builder.append("t");
builder.append(rs .getInt(2 ));
System.out.println(builder.toString());
}
// eliminar la tabla
s.execute("eliminar tabla hellotable"
);
System.out.println("Tabla eliminada hellotable");
rs.close();
s.close(); p>
s.close();
p>
System.out.println("Conjunto de resultados cerrado y declaración");
conn.commit() ;
conn.close();
System.out.println("Transacción confirmada y conexión cerrada");
try { // realizar una limpieza apagado
DriverManager.getConnection("jdbc:derby:; apagado=true");
} catch (SQLException se) {
System.out.println ("La base de datos se cierra normalmente");
}
} catch (Throwable e) {
// maneja la excepción
}
System.out.println("SimpleApp finalizada" );
}
}
Luego, vamos al comando línea (este ejemplo es la plataforma Windows, por supuesto, puede realizar pequeños cambios en otros sistemas) Escriba el siguiente comando:
Listado 2. Ejecute el comando HelloJavaDB
java –cp. ;JAVA_HOMEDlibderby.jar HelloJavaDB
Figura 1. Resultados de la ejecución del programa HelloJavaDB
p>
El procedimiento anterior no es diferente al anterior. La diferencia es que ya no necesitamos preocuparnos por la configuración del DBMS, porque Derby ha creado automáticamente un nuevo directorio llamado helloDB en el directorio actual para almacenar físicamente datos y registros. Todo lo que necesita hacer es prestar atención al problema del nombre: el nombre del controlador en modo integrado debe ser org.apache.derby.jdbc.EmbeddedDriver al crear una nueva base de datos, debe agregar create=true después del protocolo. Además, para cerrar todas las bases de datos y motores Derby, puede utilizar el siguiente código:
Listado 3. Apagar todas las bases de datos y motores Derby
DriverManager.getConnection("jdbc: derby:;shutdown=true ");
Si solo desea cerrar una base de datos, puede llamar a:
Listado 4. Cerrar una base de datos
DriverManager .getConnection("jdbc:derby : helloDB; Shutdown=true ");
De esta manera, el costo de mantener y administrar la base de datos usando Derby en modo integrado es cercano a 0. Esta es una buena noticia para las personas que quieren centrarse en escribir código. Sin embargo, algunas personas no pueden evitar preguntar: dado que existe un modo integrado, ¿por qué la mayoría de los DBMS no adoptan ese modo? Hagamos un pequeño experimento. Cuando ejecutamos el programa HelloJavaDB en dos ventanas de línea de comando al mismo tiempo. Como resultado, el resultado de uno es consistente con el anterior, pero ocurre un error en el otro, como se muestra en la Figura 2.
Figura 2. Limitaciones del modo integrado
El motivo del error es realmente muy simple: cuando se utiliza el modo integrado, Derby en sí no estará en un proceso independiente, sino que se ejecutará en el misma máquina virtual Java (JVM) que la aplicación. Por lo tanto, Derby pasa a formar parte de la aplicación como cualquier otro archivo jar utilizado por la aplicación. No es difícil entender por qué nuestro programa de muestra puede ejecutarse sin problemas agregando el archivo derby jar al classpath. Esto también muestra que solo una JVM puede iniciar la base de datos: y dos aplicaciones que se ejecutan en diferentes instancias de JVM, naturalmente, no pueden acceder a la misma base de datos.
En vista de las limitaciones anteriores y la necesidad de múltiples conexiones desde diferentes JVM para acceder a una base de datos, la siguiente sección presentará otro modo de Derby: Servidor de red.
Modo Servidor Web
Como se mencionó anteriormente, el modo servidor web es un modo cliente/servidor más tradicional. Necesitamos iniciar un servidor web Derby para manejar las solicitudes de los clientes, ya sea que provengan de la misma instancia JVM o de otra máquina en la red. Al mismo tiempo, el cliente utiliza el protocolo DRDA (Arquitectura de base de datos relacional distribuida) para conectarse al servidor. Este es un estándar de interacción de bases de datos recomendado por The Open Group. La Figura 3 ilustra la estructura general del patrón.
Debido a que los desarrolladores de Derby han trabajado duro para minimizar las diferencias entre el modo de servidor de red y el modo integrado, podemos lograrlo simplemente modificando el programa en el Listado 1. Como se muestra en el Listado 5, agregamos una nueva función y algunas variables de cadena a HelloJavaDB. No es difícil ver que el nuevo código solo cambia algunas cadenas específicamente señaladas en la sección anterior: la clase del controlador es org.apache.derby.jdbc.ClientDriver, y el protocolo para conectarse a la base de datos pasa a ser jdbc:derby: / /localhost:1527/. Esta es una cadena similar a una URL y, de hecho, el formato de conexión para los clientes de la red Derby es: jdbc:derby://server[:port]/databaseName[;attributeKey=value]. En este ejemplo, utilizamos la máquina local más simple como servidor y el puerto es el puerto predeterminado de Derby, 1527.
Figura 3. Arquitectura en modo servidor web Derby
Listado 5. HelloJavaDB en modo servidor web
clase pública HelloJavaDB {
pública estática String driver = "org.apache.derby.jdbc.EmbeddedDriver";
protocolo de cadena estática pública = "jdbc:derby:";
main vacío estático público (String[] args ) {
// igual que antes
}
private static void parseArguments(String[] args) {
if ( args .length == 0 || args.length gt; 1) {
return;
}
if (args[0].equalsIgnoreCase(" derbyclient ")) {
framework = "derbyclient";
driver = "org.apache.derby.jdbc.ClientDriver";
protocol = "jdbc : derby://localhost:1527/";
}
}
}
Por supuesto, simplemente tener el cliente no es suficiente Sí, también necesitamos iniciar el servidor web. La clase en Derby que controla el servidor de red es org.apache.derby.drda.NetworkServerControl, así que simplemente escriba el siguiente comando. Si desea conocer más opciones de NetworkServerControl, simplemente elimine el parámetro de inicio y podrá ver la información de ayuda. En cuanto a la implementación del lado del servidor de red, Derby está incluido en derbynet.jar.
Listado 6. Iniciando el servidor de red
java -cp .;"C:Program FilesJavajdk1.6.0dblibderby.jar";
"C:Program FilesJavajdk1 6.0dblibderbynet.jar"
org.apache.derby.drda.NetworkServerControl start
En consecuencia, la implementación del cliente de red se incluye en derbyclient.jar. Por lo tanto, solo necesita agregar el archivo jar al classpath y el cliente modificado podrá leer los datos sin problemas. Intente usar dos ventanas de línea de comando para conectarse nuevamente a la base de datos y obtendrá los resultados correctos. Si el servidor ya no es necesario, se puede apagar utilizando el parámetro de apagado de NetworkServerControl.
Más
Hasta ahora, el artículo ha presentado el nuevo miembro de Java SE 6: Java DB (Derby), y también ha presentado cómo utilizar Java en modo integrado y en modo de servidor de red. . Por supuesto, esto es solo una muestra, y es necesario encontrar opciones más avanzadas en la documentación de Sun y Derby. Al final de este capítulo, presentaremos brevemente varios dispositivos Java DB para acelerar el desarrollo.
Todos están ubicados en el paquete org.apache.derby.tools y pueden usarse cuando necesite obtener información o realizar pruebas durante el proceso de desarrollo. ij: una herramienta utilizada para ejecutar scripts SQL; dblook: una herramienta para extracción de esquemas y generación de DDL para bases de datos Derby sysinfo: una clase de herramienta para mostrar información del sistema y Derby;