Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Cita se tabela predmet i ispisuju se svi predmeti koji su obavezni na smeru
- * ciji je id 201. Za svaki od tih predmeta, korisnik se pita da li zeli da
- * predmetu poveca broj bodova za 1, pa ako zeli onda izvrsiti izmenu i potvrditi
- * promenu. Napisati program tako da moze da radi u visekorisnickom
- * rezimu. Obrada jednog predmeta predstavlja jednu transakciju.
- */
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- import java.util.ArrayList;
- import java.util.Scanner;
- public class Primer {
- static{
- try {
- Class.forName("com.ibm.db2.jcc.DB2Driver");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- ArrayList<Integer> obradjeni = new ArrayList<Integer>();
- String url = "jdbc:db2://localhost:50001/VSTUD";
- Scanner scanner = new Scanner(System.in);
- Boolean obradjenPredmet = true;
- try {
- Connection con = DriverManager.getConnection(url, "student", "abcdef");
- ResultSet rs = null;
- String sql = "select id_predmeta, naziv " +
- "from predmet " +
- "where id_predmeta in (select id_predmeta " +
- "from obavezan_predmet " +
- "where id_smera = 201) and bodovi <8";
- PreparedStatement ps = con.prepareStatement(sql, rs.HOLD_CURSORS_OVER_COMMIT);
- rs = otvoriKursor(ps);
- String update = "update predmet " +
- "set bodovi = bodovi + 1 " +
- "where current of ";
- String cursorName = null;
- while(rs.next()){
- try {
- int id_predmeta = rs.getInt(1);
- String naziv = rs.getString(2);
- if(!obradjeni.contains(id_predmeta)){
- System.out.println("Predmet " + naziv);
- System.out.println("Da li zelite da azurirate broj bodova?");
- char c = scanner.next().charAt(0);
- if(c=='d' || c=='D'){
- cursorName = rs.getCursorName();
- Statement updateS = con.createStatement();
- /* Azuriranje */
- try{
- updateS.executeUpdate(update + cursorName);
- System.out.println("Azurirano");
- }catch(SQLException e){
- /* Proverava se da li trazeni X katanac ne dovodi do nekog
- * od problema konkurentog izvrsavanja
- */
- if(e.getErrorCode() == -911 || e.getErrorCode() == -913){
- rs.close();
- rs = obradiCekanje(rs, con, ps);
- obradjenPredmet = false;
- }
- }
- }
- /* Ukoliko je predmet obradjen tj. promenljiva obradjenPredmet
- * nepromenjena evidentiramo obradjen predmet
- */
- if(obradjenPredmet){
- /* Obrada jednog predmeta treba da predstavlja jednu transakciju,
- * zato sada zelimo commit */
- /* Kursor je otvoren sa opcijom WITH HOLD, tj. naredba je pripremljena
- * sa opcijom HOLD_CURSORS_OVER_COMMIT pa commit ne zatvara kursor. */
- con.commit();
- obradjeni.add(id_predmeta);
- }
- /* Priprema promenljive za narednu iteraciju. */
- obradjenPredmet = true;
- }
- } catch(SQLException e){
- /* Proverava se da li trazeni S katanac ne dovodi do nekog
- * od problema konkurentog izvrsavanja. Ukoliko da obradjuje
- * se cekanje.
- */
- if(e.getErrorCode() == -911 || e.getErrorCode() == -913)
- rs = obradiCekanje(rs, con, ps);
- }
- }
- con.commit();
- rs.close();
- ps.close();
- con.close();
- } catch (SQLException e) {
- System.out.println("SQL error: SQLCODE" + e.getErrorCode());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private static ResultSet obradiCekanje(ResultSet rs, Connection con, PreparedStatement ps) throws SQLException {
- System.out.println("Objekat je zakljucan od strane druge transakcije! Sacekajte!");
- con.rollback();
- System.out.println("Rollback");
- return otvoriKursor(ps);
- }
- private static ResultSet otvoriKursor(PreparedStatement ps) throws SQLException {
- ResultSet rs = ps.executeQuery();
- return rs;
- }
- }
Add Comment
Please, Sign In to add comment