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<Connection, Long> 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<Connection, Long>();
this.unlocked = new Hashtable<Connection, Long>();
}
//Создание соединения с БД
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<Connection> 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);
}
}