-
triggers en java
Salut!
Je voudrais savoir comment reproduire le fonctionnement d'un trigger mais dans mon application java: c'est à dire que dès qu'il y a insertion d'une nouvelle ligne dans ma base de données par un programme qui tourne en arrière plan, cette ligne sera immédiatement affichée dans ma jtable.
(j'ai utilisé un timer qui répète toute les n secondes la connexion à la base de donnée et la requête SELECT et dont le fonctionnement a réactualisé l'affichage de ma jtable mais s'il y a des nouvelles insertions dans la base pendant que l'application est en cours d'exécution ça ne marche que si je ferme l'application et je la réexécute et non en temps réel!!)
svp aidez moi c'est vraiment urgent!!
Merci!!
-
si tu utilise une datasource, verifie que ton niveau d'isolation n'est pas en RepatableRead
-
Excuse moi je suis débutante en java donc je ne sais même pas ce que c'est qu'une datasource!
-
envoie la ligne de code qui te permet d'ouvrir la base de données
-
// Charger le pilote Oracle
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
// Connexion à la base de données
Connection conn =DriverManager.getConnection ("jdbc:oracle:thin:@127.0.0.1:1521:ubixstg", "user", "password");
-
essai de placer cette ligne après
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED)
si cela ne fonctionne pas essaie
conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED)
-
Salut!!!
J'ai essayé ton code:
Pour la première ligne (conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);):rien ne change:la réactualisation ne se fait que si je réexecute l'application.
Et pour le deuxième cas:la fenêtre ne s'affiche même plus!!
-
-
le comportement que tu me decris est bizarre
on a l'impression que ton application est isolé dans une transaction
es tu sur de ne pas avoir de stacktrace ?
-
Salut!
Désolée mais je ne sais pas non plus ce que c'est qu'un stack trace donc je t'envoie mon code en espérant que tu puisse m'aider!
Merci!!
Code:
package oracle_cnn;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.Dimension;
import java.sql.*;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import com.sun.tools.doclets.standard.tags.SimpleTaglet;
import com.sun.corba.se.ActivationIDL.Server;
class test extends JPanel implements TableModelListener
{
public void tableChanged(TableModelEvent e)
{ }
public static void main(String[] argv) throws SQLException {
Timer minuteur = new Timer();
//nouvelle fenêtre
final JFrame f = new JFrame("Application");
TimerTask tache = new TimerTask() {
public void run() {
f.setSize(1200, 1200);
JPanel pannel = new JPanel();
JTabbedPane onglets = new JTabbedPane(SwingConstants.TOP);
/*********************************************************************************************/
/*****barre de menu****/
/* Création des composants */
JPanel panel1= new JPanel();
/* Bar de menu */
JMenuBar menu_bar1 = new JMenuBar();
/* différents menus */
JMenu menu1 = new JMenu("Fichier");
JMenu menu2 = new JMenu("Aide");
/* differents choix de chaque menu */
JMenuItem generalites = new JMenuItem("Généralités");
JMenuItem quitter = new JMenuItem("Quitter");
JMenuItem aide = new JMenuItem("Aide");
/* Ajout de composants aux conteneurs */
f.getContentPane().add(panel1,"South");
/* Ajouter les choix au menu */
menu1.add(generalites);
menu1.add(quitter);
menu2.add(aide);
/* Ajouter les menu sur la bar de menu */
menu_bar1.add(menu1);
menu_bar1.add(menu2);
/* Ajouter la bar du menu à la frame */
f.setJMenuBar(menu_bar1);
/* clic sur le choix Démarrer du menu fichier */
generalites.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JFrame frame1= new JFrame("Présentation de l'application");
JPanel panel2= new JPanel();
JLabel texte = new JLabel() ;//On crée notre objet
texte.setPreferredSize(new Dimension(250,25)) ;//On lui donne une taille
texte.setText("................."); //On lui donne un texte
panel2.add(texte);//On l'ajoute au container
frame1.getContentPane().add(panel2);
frame1.setResizable(true);
frame1.setSize(200,200);
frame1.show();
frame1.setLocationRelativeTo(null);
}
});
/* clic sur le choix Fin du menu fichier */
aide.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JFrame frame2= new JFrame("Aide");
JPanel panel3= new JPanel();
JLabel texte = new JLabel() ;//On crée notre objet
texte.setPreferredSize(new Dimension(250,25)) ;//On lui donne une taille
texte.setText("................."); //On lui donne un texte
panel3.add(texte);//On l'ajoute au container
frame2.getContentPane().add(panel3);
frame2.setResizable(true);
frame2.setSize(200,200);
frame2.show();
frame2.setLocationRelativeTo(null);}});
quitter.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}});
/*****************************************************************************************/
/**** Connexion à la base *****/
// Charger le pilote Oracle
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
// Connexion à la base de données
Connection conn =DriverManager.getConnection ("jdbc:oracle:thin:@127.0.0.1:1521:ubixstg", "user", "Password");
// conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
//Création d'un objet requête
Statement stmt = conn.createStatement ();
Statement stmt1 = conn.createStatement ();
Statement stmt2 = conn.createStatement ();
Statement stmt4 = conn.createStatement ();
Statement stmt3 = conn.createStatement ();
//Envoyer la requête et récupérer le résultat
ResultSet rset1 = stmt.executeQuery ("select col from tab1");
ResultSet rset2 = stmt1.executeQuery ("select col from tab2");
ResultSet rset5 = stmt2.executeQuery ("select col from tab3");
ResultSet rset4 = stmt3.executeQuery ("select col from tab4");
ResultSet rset6 = stmt4.executeQuery ("select col from tab5");
/*******************************************************************************/
/*** Affichage résultat requête 1 dans la table 1 ***/
Vector values = new Vector();
int i=1;
while(rset1.next() & rset2.next()) //& rset3.next())
{
Vector tab1 = new Vector();
tab1.add("Proc"+i); //on met le nom exact de la colonne affichée dans la base
//à refaire pour les autres colones
tab1.add(rset1.getString("col1"));
tab1.add(rset2.getString("col2"));
//tab1.add(rset3.getString("col3"));
values.addElement(tab1);
i++;
}
Vector names= new Vector();
names.addElement("titre1");
//a refaire pour plus de colone
names.addElement("titre2");
names.addElement("titre3");
names.addElement(titre4");
DefaultTableModel model = new DefaultTableModel (values,names){
public boolean isCellEditable(int iRowIndex, int iColumnIndex)
{
return false;
}
};
JTable tab1 = new JTable(model);
tab1.setPreferredScrollableViewportSize(new Dimension(800, 800));
tab1.getTableHeader().setReorderingAllowed(false);
/****************************Affichage de la table2***********************************************/
Vector values1 = new Vector();
int j=1;
while(rset4.next())
{
Vector tab2 = new Vector();
tab2.add("Proc"+j);
tab2.add("");//rset1.getString("col1")); //on met le nom exact de la colonne affichée dans la base
//à refaire pour les autres colones
tab2.add("");//rset1.getString("col2"));
//tab2.add(rset4.getString("col3"));
values1.add(tab2);
j++;
}
Vector names1= new Vector();
names1.addElement("titre1");
//a refaire pour plus de colone
names1.addElement("titre2");
names1.addElement("titre3");
names1.addElement("titre4");
DefaultTableModel model1 = new DefaultTableModel (values1,names1){
public boolean isCellEditable(int iRowIndex, int iColumnIndex)
{
return false;
}
};
JTable tab2 = new JTable(model1);
tab2.setPreferredScrollableViewportSize(new Dimension(800, 800));
tab2.getTableHeader().setReorderingAllowed(false);
/****************************Affichage de la table3***********************************************/
Vector values2 = new Vector();
int k=1;
while(rset5.next() & rset6.next())
{
Vector tab3 = new Vector();
tab3.add("Proc"+k);
tab3.add(rset5.getString("col1"));
//on met le nom exact de la colonne affichée dans la base
//à refaire pour les autres colones
tab3.add(rset6.getString("col2"));
tab3.add("");//rset1.getString("col3"));
values1.add(tab2);
k++;
values2.add(tab3);
}
Vector names2= new Vector();
names2.addElement("titre1");
//a refaire pour plus de colone
names2.addElement("titre2");
names2.addElement("titre3");
names2.addElement("titre4");
DefaultTableModel model2 = new DefaultTableModel (values2,names2){
public boolean isCellEditable(int iRowIndex, int iColumnIndex)
{
return false;
}
};
JTable tab3 = new JTable(model2);
tab3.setPreferredScrollableViewportSize(new Dimension(800, 800));
tab3.getTableHeader().setReorderingAllowed(false);
/*******************************************************************************/
//conteneur du premier onglet
JPanel onglet1 = new JPanel();
JLabel titreOnglet1 = new JLabel("Process1");
onglet1.add(titreOnglet1);
onglet1.setPreferredSize(new Dimension(900, 900));
onglets.addTab("Running Process", onglet1);
onglet1.add(new JScrollPane(tab1));
/********************Gérer les doubles clics au niveau de la table1**************************/
tab1.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
//code à exécuter
JFrame fen = new JFrame("Fenêtre");
fen.setSize(600,300);
fen.setLocationRelativeTo(null);
fen.setVisible(true);
}
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
});
/*********************************************************************/
//conteneur du second onglet
JPanel onglet2 = new JPanel();
JLabel titreOnglet2 = new JLabel("Process2");
onglet2.add(titreOnglet2);
onglets.addTab("Database Operation", onglet2);
onglet2.setPreferredSize(new Dimension(900, 900));
onglet2.add(new JScrollPane(tab2));
//conteneur du troisième ongle-t
JPanel onglet3 = new JPanel();
JLabel titreOnglet3 = new JLabel("Process3");
onglet3.add(titreOnglet3);
onglets.addTab("Process Properties", onglet3);
onglet3.setPreferredSize(new Dimension(900, 900));
onglet3.add(new JScrollPane(tab3));
onglets.setOpaque(true);
pannel.add(onglets);
f.getContentPane().add(pannel);
pannel.revalidate();
pannel.repaint();
//taille de la fenêtre
f.setSize(1200, 1200);
f.repaint();
//Rendre la fenêtre visible
f.setVisible(true);
// Fermeture de la connexion
conn.close();
}
catch (SQLException ex) {
}
}
};
minuteur.schedule(tache, 0, 12000);
}
}
-
je pense que ton probleme n'est pas lié à la base de donnée mais à ton appli swing. En effet tu recrée systematiquement toute ton interface dans la méthode run alors que tu devrais faire un simple refresh.
donc pour en etre certains :
dans la boucle qui te permet de remplir le vector tab1, insere
System.out.println(rset1.getString("col1"));
tu verra alors le nombre de ligne retourné par le statement
si ce nombre évolue en fonction des insertions en tache de fond mais pas ton interface, le problème viens de l'interface.
Dans ce cas pose ta question dans le forum Swing
-
Tu avais raison!!
Le prgramme marche parfaitement sur la console mais c'est au niveau de l'affichage qu'il y a un problème!!
Je vais voir ça dans le forum Swing!
Merci bcp pour ton aide!!