import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.IOException; import java.sql.*; import java.util.Random; import java.math.RoundingMode; import java.math.BigDecimal; /** * Created by IntelliJ IDEA. * User: yES * Date: 08.09.2009 * Time: 18:27:08 * To change this template use File | Settings | File Templates. */ public class Main { /** * Главный метод, требуется введение параметра. Параметр args[0]: * 1 - Создание новых записей в БД * 2 - Удаление записей из БД * 3 - Выполнение запроса: Посчитать зарплату каждого программиста * 4 - Выход из программы * * @param args массив аргументов из консоли */ public static void main(String[] args) throws SQLException { //Объявление переменных Statement stmt; Connection c; String driver = "org.postgresql.Driver"; String conUrl = "jdbc:postgresql://localhost/web"; String user = "postgres"; String passsword = "qwerty"; // Создание подключения к конкретной БД JDBCConnectionPool.getInstance(); JDBCConnectionPool pool = new JDBCConnectionPool(driver, conUrl, user, passsword); c = pool.checkOut(); stmt = c.createStatement(); int cs = 0; do { //Чтение введенного параметра String s = ""; Menu(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { s = br.readLine(); } catch (IOException e) { e.printStackTrace(); } try { cs = Integer.decode(s); } catch (NumberFormatException e) { System.out.println("Ошибко! Цифарки нада вводить!"); } //Выбор сценария +) switch (cs) { case 1: MakeDB(stmt); break; case 2: DeleteDB(stmt); break; case 3: Query(stmt); break; } } while (cs != 4); pool.checkIn(c); } //Метод создания записей в БД public static void MakeDB(Statement stmt) { try { //Выполнение SQL запросов stmt.executeUpdate("CREATE TABLE SOFT\t(\n" + "ID \t\tNUMERIC NOT NULL PRIMARY KEY,\n" + "NAME TEXT,\n" + "COST FLOAT);\n" + "\n" + "CREATE TABLE PROGRAMMERS\t(\n" + "ID \t\tNUMERIC NOT NULL PRIMARY KEY,\n" + "NAME TEXT);\n" + "\n" + "CREATE TABLE SOFT_PROGS\t(\n" + "SOFT_ID NUMERIC,\n" + "PROG_ID NUMERIC,\n" + "FOREIGN KEY (SOFT_ID) REFERENCES SOFT (ID),\n" + "FOREIGN KEY (PROG_ID) REFERENCES PROGRAMMERS (ID));"); stmt.executeUpdate("INSERT INTO soft (id, name, cost) VALUES (1,'Windows',430.6);"); stmt.executeUpdate("INSERT INTO soft (id, name, cost) VALUES (2,'Mac OS',500.1);"); stmt.executeUpdate("INSERT INTO soft (id, name, cost) VALUES (3,'FreeBSD',10);"); stmt.executeUpdate("INSERT INTO soft (id, name, cost) VALUES (4,'Ubuntu',10);"); stmt.executeUpdate("INSERT INTO programmers (id, name) VALUES (1,'Gates');"); stmt.executeUpdate("INSERT INTO programmers (id, name) VALUES (2,'Jobs');"); stmt.executeUpdate("INSERT INTO programmers (id, name) VALUES (3,'Torvalds');"); //Создание вспомогательного вида для выполнения запроса stmt.executeUpdate("CREATE VIEW COUNT_PROG(ID,CountP) AS SELECT SOFT_ID, COUNT(SOFT_ID) FROM SOFT_PROGS GROUP BY SOFT_ID"); //Генерация записей таблицы SOFT_PROGS Random ran = new Random(); int count = 3 + ran.nextInt(6); for (int i = 0; i <= count; i++) { stmt.executeUpdate("INSERT INTO SOFT_PROGS (soft_id, prog_id) VALUES (" + (1 + ran.nextInt(4)) + "," + (1 + ran.nextInt(3)) + ");"); } System.out.println("Записи успешно добавлены\n"); } catch (SQLException e) { System.out.println("Ошибко!!! БД уже создана!\n"); } } //Удаление записей из БД public static void DeleteDB(Statement stmt) { try { stmt.executeUpdate("DROP VIEW COUNT_PROG"); stmt.executeUpdate("DROP TABLE SOFT_PROGS"); stmt.executeUpdate("DROP TABLE programmers"); stmt.executeUpdate("DROP TABLE soft"); System.out.println("Таблицы и записи удалены из бд!\n"); } catch (SQLException e) { System.out.println("Ошибко!!! БД уже удалена!\n"); } } //Метод для выполнения запроса public static void Query(Statement stmt) { ResultSet rs; try { rs = stmt.executeQuery("SELECT p.name, SUM(s.Cost/c.CountP) FROM Programmers p, Soft s, SOFT_PROGS sp, COUNT_PROG c " + "WHERE (p.ID=sp.PROG_ID) AND (sp.SOFT_ID=s.ID) AND (c.ID=s.ID) GROUP BY p.name;"); while (rs.next()) { String name = rs.getString(1); float salary = rs.getFloat(2); double newsalary = new BigDecimal(salary).setScale(2, RoundingMode.UP).doubleValue(); System.out.println("Зарплата: " + name + " " + newsalary + " $"); } rs.close(); System.out.println(); } catch (SQLException e) { System.out.println("Ошибко!!! В БД отсутствуют запрашиваемые данные!\n"); } } //Метод реализации меню public static void Menu() { System.out.println("1 => Создать таблицы и записи в БД"); System.out.println("2 => Удалить таблицы и записи из БД"); System.out.println("3 => Запрос: Посчитать зарплату каждого программиста"); System.out.println("4 => Выход из программы"); } } import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Hashtable; import java.util.Enumeration; /** * Created by IntelliJ IDEA. * User: yES * Date: 15.09.2009 * Time: 16:42:03 * */ public class JDBCConnectionPool { //объявление переменных private static volatile JDBCConnectionPool instance; private String dsn, usr, pwd; private long expirationTime; //"время жизни Connection" private Hashtable locked, unlocked; private JDBCConnectionPool() { } //Реализация Singlton public static JDBCConnectionPool getInstance() { if (instance == null) synchronized (JDBCConnectionPool.class) { if (instance == null) instance = new JDBCConnectionPool(); } return instance; } //Конструктор public JDBCConnectionPool(String driver, String dsn, String usr, String pwd) { try { Class.forName(driver).newInstance(); } catch (Exception e) { e.printStackTrace(); } this.dsn = dsn; this.usr = usr; this.pwd = pwd; this.expirationTime = 30000; // 30 секунд this.locked = new Hashtable(); this.unlocked = new Hashtable(); } //Создание соединения с БД protected Connection create() { try { return (DriverManager.getConnection(dsn, usr, pwd)); } catch (SQLException e) { e.printStackTrace(); return (null); } } //Метод для закрытия соединения с БД public void expire(Connection o) { try { o.close(); } catch (SQLException e) { e.printStackTrace(); } } //Проверка наличия соединения с БД public boolean validate(Connection o) { try { return (!o.isClosed()); } catch (SQLException e) { e.printStackTrace(); return (false); } } //Перемещение неиспользуемого Connection в хэштэйбл с доступными Connection'ами public synchronized void checkIn(Connection t) { locked.remove(t); unlocked.put(t, System.currentTimeMillis()); } public synchronized Connection checkOut() { long now = System.currentTimeMillis(); Connection t; if (unlocked.size() > 0) { Enumeration e = unlocked.keys(); while (e.hasMoreElements()) { t = e.nextElement(); if ((now - unlocked.get(t)) > expirationTime) { // Connection не используется заданное время unlocked.remove(t); expire(t); t = null; } else { if (validate(t)) { unlocked.remove(t); locked.put(t, now); return (t); } else { // Connection закрыт unlocked.remove(t); expire(t); t = null; } } } } // Нет доступных Connection. Создать новый t = create(); locked.put(t, now); return (t); } }