Pregunta:
¿Base de datos contenida?
2011-02-02 13:53:58 UTC
Hola, estoy desarrollando un software en Java SE que maneja una base de datos. En este caso es una base de datos MySQL por simplicidad, pero podría ser ORACLE o cualquier otro.
El problema se plantea a la hora de exportar el programa a otros usuarios que obviamente no dispongan de esas bases de datos instaladas o ni siquiera tengan WAMP / LAMP / MAMP.

Hay alguna manera de forzar la instalación de dichos servidores y su "encendido" desde el mismo código para que el usuario pueda contar con la base de datos? (Ya se que desde el código podría, una vez creada la base de datos, ejecutar scripts SQL para crear las tablas, etc)

Cual podría ser una alternativa? la única sería un sistema de ficheros propio, que gestione las inserciones y modificaciones, búsquedas, los compactados...etc?

Me gustaría que la gente pudiera comentarme las alternativas o como lo hacen en su trabajo o que me faciliten términos de búsqueda para seguir con la "investigación" al respecto.

Si no está clara la duda, por favor planeadme las dudas y tal vez nos aclaremos ^_^

Muchas gracias!
Tres respuestas:
Mauricio
2011-02-02 17:36:06 UTC
Hola.

Pues si la idea es crear y administrar una base de datos local, podrías utilizar una base de datos embebida. La solución podría ser Apache Derby (http://db.apache.org/derby/ ), que es un DBM creado absolutamente en Java y que puede agregarse a tu programa como librería externa.

El siguiente es un ejercicio que hice hace varios años. Te dejo el código de la clase que manejaba la base de datos, para que tengas una idea de cómo se crea la base de datos, se realiza una conexión a ella, etc.

La clase está a nivel de estudiante, pero funciona... :)



import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;

import java.io.File;



/**

*

* @author Mauricio

*/

public class SparkyBD {



public String driver = "org.apache.derby.jdbc.EmbeddedDriver";

public String protocolo = "jdbc:derby:";

private Connection conexión;

private Statement elStatement;

private ResultSet resultados;

private Properties propiedades;

private Object[][] datos, dataBuffer;

private int contador;



private void cargarDriver() throws ClassNotFoundException, InstantiationException, IllegalAccessException {

Class.forName(driver).newInstance();

}



protected SparkyBD() {

conexión = null;

elStatement = null;

resultados = null;

propiedades = new Properties();

propiedades.put("user", "usuario");

propiedades.put("password", "administrador");

dataBuffer = new Object[200][5];

}



protected void crearBD() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {

cargarDriver();

conexión = DriverManager.getConnection(protocolo + "SBD;create = true", propiedades);

elStatement = conexión.createStatement();

elStatement.execute(

"CREATE TABLE Clientes (" +

"Nombre VARCHAR(25)," +

"Apellido VARCHAR(25)," +

"Direccion VARCHAR(45)," +

"Horas VARCHAR(5)," +

"Fecha DATE," +

"PRIMARY KEY (Nombre,Apellido))");

}



protected void conectarBD() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {

cargarDriver();

conexión = DriverManager.getConnection(protocolo + "SBD", propiedades);

conexión.setAutoCommit(false);

elStatement = conexión.createStatement(

ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_UPDATABLE);

}



protected Object[][] getDatosBD() {

return datos;

}



protected int getRowCount() {

return contador;

}



protected void cerrarCesión() throws SQLException {

cerrarResultset();

cerrarStatement();

cerrarconexión();

}



protected void cerrarResultset() throws SQLException {

if (resultados != null) {

resultados.close();

resultados = null;

}

}



protected void cerrarconexión() throws SQLException {

if (conexión != null) {

conexión.commit();

conexión.close();

conexión = null;

}

}



protected void cerrarStatement() throws SQLException {

if (elStatement != null) {

elStatement.close();

elStatement = null;

}

}



protected boolean estáBDCerrada() throws SQLException {

return conexión.isClosed();

}



protected void ingresarConsulta(String q) throws SQLException {

datos = dataBuffer;

resultados = elStatement.executeQuery(q);

contador = 0;

while (resultados.next()) {

int j;

for (j = 0; j <= 3; j++) {

datos[contador][j] = resultados.getString(j + 1);

}

datos[contador][4] = resultados.getDate(5);

++contador;

}

}



protected void ponerQueryIngreso(String q) throws SQLException {

elStatement.execute(q);

}



protected boolean hayRegistros() throws SQLException {

boolean r = false;

r = resultados.first();

return r;

}



public static boolean existeBD() {

return new File(System.getProperty("user.dir") + File.separator + "SBD").exists();

}



protected int actualizarBD(String q) throws SQLException {

int estado = elStatement.executeUpdate(q);

return estado;

}



protected void confirmarCambiosBD() throws SQLException {

conexión.commit();

}



protected void deshacerCambiosBD() throws SQLException {

conexión.rollback();

}

}
Alejandro Pérez C.
2011-02-03 16:08:46 UTC
Pues mira, hay varias opciones en realidad.



Tienes la clásica opción de abortar la instalación o ejecución del sistema en caso de que el programa no se pueda conectar a una base de datos.



Si usas algun creador de instaladores (como InstallShield y similares), puedes ponerle al instalador como requerimiento tener instalado o poder hacer ping hacia una base de datos, o, (si te conviene más) instalar una base de datos en caso de no detectarla.



Si necesitas una base de datos portable, ya te mencionaron Apache Derby. Así mismo, también está HyperSQL, que funciona en un esquema similar.
?
2011-02-02 22:11:27 UTC
Para las bases de datos usa una de access. Así no tienes que instalar ningun gestor de base de datos. Basta con compiar el archivo.


Este contenido se publicó originalmente en Y! Answers, un sitio web de preguntas y respuestas que se cerró en 2021.
Loading...