Tips&Tricks I trucchi del mestiere

 

Copiare i dati tra due database


Il programma Φ utile per copiare i dati di una tabella da un DB allÆaltro passando i driver dei DB come parametri alla JVM; il tip Φ strutturato per esemplificare il trasferimento di una singola tabella "Utenti" i cui campi sono Nome,Cognome,cod.
Il codice Φ presente in formato sorgente nel cd-rom allegato alla rivista e/o sul sito web di ioProgrammo (www.ioprogrammo.it)
Tip fornito dal sig. R.Gabbarelli

import java.sql.*;
public class SQLServerToAccess {
	static final String FORNAME="sun.jdbc.odbc.JdbcOdbcDriver";
	static String DriverInput;
	static String DriverOutput;
	
	public static void main(String[] args) throws ClassNotFoundException{
		try{
			Class.forName(FORNAME);
			DriverInput="jdbc:odbc:"+args[0];	//driver del database sql
			DriverOutput="jdbc:odbc:"+args[1];	//driver del database access
			
			Connection conIn=DriverManager.getConnection(DriverInput);
			Connection conOut=DriverManager.getConnection(DriverOutput);
						
			Statement 
stIn=conIn.createStatement(ResultSet.TYPE_SCROLL_INSE
NSITIVE,ResultSet.CONCUR_READ_ONLY);
			ResultSet rs=stIn.executeQuery("select * from Utenti");//il resultset 
dev'essere scrollabile a causa di un problema
			
			rs.first();
			do{
				String nomeUtente=rs.getString(1);
				String cognomeUtente=rs.getString(2);
				int codiceUtente=rs.getInt(3);
				
				Statement stOut=conOut.createStatement();
				stOut.execute("INSERT INTO Utenti 
VALUES('"+nomeUtente+"','"+cognomeUtente+"',"+
codiceUtente+")");
			}
			while(rs.next());
			
			rs.last();	//questa e le righe a seguire servono ad ovviare ad un 
problema di inserimento dell'ultimo valore
			Statement first=conOut.createStatement();	//inserito nel DB di 
partenza
			first.execute("insert into Utenti 
values('"+rs.getString(1)+"','"+rs.getString(2)+"',"+rs.getI
nt(3)+")");
			
			System.out.println("Copia Terminata!");
			System.exit(0);
			}catch(SQLException e){
			System.out.println("SQL Exception!");
			System.exit(1);
		}
	}
}



Eseguire operazioni in background


Una serie di classi Java per eseguire una serie di operazioni in background. Basta estendere AbstractJob implementando execute() e BackgroundJobExecutor esegiura` in serie i lavori che vengono inseriti.
Le classi sono: Prova.java, AbstractJob.java e BackgroundJobExecutor.java.
I codici sono presenti in formato sorgente nel cd-rom allegato alla rivista e/o sul sito web di ioProgrammo (www.ioprogrammo.it)
Tip fornito dal sig. M.Schiavon

import java.util.*;

public class BackgroundJobExecutor implements Runnable {
	private Queue queue;
	private boolean stopRequest = false;
	private boolean stopping = false;
	private Thread thread;
	private final AbstractJob nop = new AbstractJob() {
		public void execute() {
			dispose();
		}
	};
	public BackgroundJobExecutor() {
		queue = new Queue();
		thread = new Thread(this);
	}
	/**
	 * Inizia a processare i job
	 */
	public void start() {
		thread.start();
	}
	/**
	 * Aggiunge un job alla coda
	 */
	public boolean add(AbstractJob job) {
		if (job == null) {
			throw new NullPointerException("Job cannot be null");
		}
		if (stopRequest || stopping) {
			throw new IllegalArgumentException("BackgroundJobExecutor has been 
stopped.");
		}
		return queue.put(job);
	}
	public void run() {
		while (!stopRequest) {
			AbstractJob l = (AbstractJob)queue.get();
			if (l == null) {
				break;
			}
			l.execute();
		}
		dispose();
	}
	/**
	 * Termina i job in coda e si ferma
	 */
	public void stop() {
		if (stopRequest) {
			throw new IllegalArgumentException("BackgroundJobExecutor has been 
stopped.");
		}
		if (!stopping) {
			stopping = true;
			queue.putLast(nop);
		}
	}
	/**
	 * Ferma l'esecusione senza necessariamente aver terminati i job in coda
	 */
	public void dispose() {
		stopRequest = true;
		queue.clear();
		if (thread != null) {
			thread.interrupt();
			thread = null;
		}
	}
	private class Queue {
		private List list = new LinkedList();
		public synchronized Object get() {
			while (list.size() == 0) {
				try {
					wait();
				} catch (InterruptedException ex) {
					return null;
				}
			}
			Object o = list.iterator().next();
			list.remove(o);
			return o;
		}
		public synchronized boolean put(Object obj) {
			boolean b = list.add(obj);
			notify();
			return b;
		}
		public synchronized void clear() {
			list.clear();
		}
		public synchronized void putLast(Object o) {
			list.add(list.size(), o);
		}
	}
}