среда, 1 августа 2012 г.

db: jdbc

    При работе с JDBC разделяют два понятия: JDBC API и JDBC Driver.
    JDBC API - это набор классов и интерфейсов, которые лежат в пакетах java.sql.* и javax.sql.* и являются частью JDK. Т.е. идут в составе каждой стандартной JVM.
    К важнейшим классам JDBC API относятся: DriverManager, DataSource, Driver, Connection, Statement, PreparedStatement, ResultSet, SQLException.
    JDBC Driver "в узком смысле" - это класс (не абстрактный) ,который реализует интерфейс из JDBC API - java.sql.Driver.
    JDBC Driver "в широком смысле" - это набор скомпилированных классов и интерфейсов среди которых важнейший - это реализация интерфейса из JDBC API java.sql.Driver и вспамагательные классы (реализации Connection, ResultSet, ...).

Statement - соответсвует отному обращению к базе (select, insert, update, delete, stor proc, batch)
Connction - соответств одному модключению к базе - больше транзакции
Driver - соотвеств всем подключениям к одной базе
DriverManager - всем подключениям из одной жвм ко всем базам

    JDBC API фактически состоит из 4-х независимых групп классов:
1) DML/DDL: Connection, Statement, PreparedStatement, CallableStatement, ResultSet
2) Metadata: 
    - DatabaseMetaData x = connection.getMetaData()
    - ResultSetMetaData y = resultSet.getMetaData();
    - ParameterMetaData y = preparedStatement.getParameterMetaData();
3) App servers: pooling (), distributed transactions(XAConnection, XADataSource), DataSource
4) RowSet: javax.sql.rowset.* (http://docs.oracle.com/javase/tutorial/jdbc/basics/webrowset.html)

Теория
    - понятие JDBC Driver, Driver, DataSource, загрузка драйвера.
    - типы драйверов (1,2,3,4)
    - URL к базе
    - Connection к базе, многопоточность, открытие/закрытие.
    - транзакции
    - connection pool

Детали
1. Мы используем Connector/J в качестве JDBC Driver.


Кругозор
1. Что означает аббревиатура ACID, и как эти свойства реализуются в JDBC?
2. Что означает OLAP-запрос и OLTP-запрос. Приведите примеры.
3. Что означает DDL и DML. Приведите примеры.

Уровни познания JDBC
    Уровень #1
    Вы можете рассказать про классы Driver, DriverManager, Connection, PreparedStatement, Statement, ResultSet, SQLException. Их роли и как их использовать.
    Вы можете соединиться с БД, выполнить простейший SELECT * FROM Users и вычитать пользователей в List<User>.
    Вы можете соединиться с БД, создать PreparedStatement и выполнить простейший INSERT.
    Вы понимаете как Driver регистрируется в DriverManager.
    Уровень #2
    Классы: DataSource, CallableStatement, Savepoint
    Вы можете сделать batch update.
    Вы можете сделать INSERT и получить значение автогенерированного поля (первичного ключа).
    Вы понимаете куда вставляется connection pool, и можете использовать один из них (c3p0, proxool, dbcp). Вы можете назвать наиболее полезные свойства, которые можно установить у pool.
    Вы понимаете чем определяются границы транзакции (transaction boundaries) и что это значит. Вы понимаете как соотносятся Savepoint-ы с границами транзакций.
    Вы понимаете, что значит SQL injection и как PreparedStatement помогает с ним бороться.
    Вы можете рассказать про первые 3 нормальные формы.
    Вы понимаете что значит выбор движка таблиц Innodb или MyISAM внутри MySQL.
    Уровень #3
    Классы: XAConnection, XADataSource
    Вы понимаете разницу между версионниками и блокировочниками. Вы можете рассказать про то как реализованы уровни изоляции в какой-либо БД (MySQL Innodb).
    Вы можете рассказать про первые 5 нормальных форм и нормальную форму Бойса-Кодда.
    Вы можете рассказать про преимущества реляционной модели перед альтернативными.
    Вы можете грубо спроектировать connection pool.
    Вы понимаете что такое XA-транзакции. Вы понимаете что такое двухфазный коммит и понимаете что есть и другие (трехфазный коммит, PAXOS коммит). 


Лабораторные
    db.jdbc.without_dm
    Присоединитесь к БД и вычитайте пользователей из таблицы не используя класс DriverManager (создайте экземпляр new com.mysql.jdbc.Driver()). Смысл: поймете, для чего служит DriverManager.
    db.jdbc.generated_keys
    Перепишите UserDao.insert(...) так, что бы он возвращал значение сгенеренного базой первичного ключа.

    db.jdbc.batch_insert
    Допишите UserDao.insert(List<User>) так, что бы он встравлял список пользователей, используя batch update.

    db.jdbc.c3p0_props
    Просмотрите все свойства c3p0 и разделите их на две группы - те, манипулирование которыми может увеличить скорость доступа, и те, которые не увеличат (сервисные, для мониторинга).
    db.jdbc.isolation_levels
    MySQL Innodb - это версионник, значит его TRANSACTION_SERIALIZABLE - "не настоящий". Приведите несколько примеров пар SQL, таковых, что запущенный одновременно они приводят к неупорядочиваемой истории.


Камасутра для Камикадзе
x) можно ли при помощи JDBC создавать в БД хранимые процедуры? А вызывать уже созданные?

x) можно ли при помощи JDBC "слушать" изменения в базе (аналог ContiniousQuery в IMDG)? Что "слушают" методы ?, ?, ?

x) начиная с JDBC 4.0 можно больше не делать Class.forName(...). 
"Thanks to the Java SE Service Provider mechanism included in Mustang, Java developers no longer need to explicitly load JDBC drivers using code like Class.forName() to register a JDBC driver. The DriverManagerclass takes care of this by automatically locating a suitable driver when the DriverManager.getConnection() method is called. This feature is backward-compatible, so no changes are needed to the existing JDBC code.http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html
    "Service Provider mechanism" - общий механизм загрузки сервисов в JDK (не только для JDBC). Приведите пример, как его можете использовать вы в архитектуре своих проектов (это реализация шаблона Plugin).

x) в спецификации JDBC определено 4 типа драйверов (Type 1, 2, 3, 4). К какому типу относится Connector/J? А у Oracle, говорят, есть несколько драйверов разных типов (JDBC Thin Driver, JDBC OCIJDBC KPRB driverhttp://www.orafaq.com/wiki/JDBC. Зачем?

x) в составе java.sql.* есть транзиентные и нетранзиентные исключения (потомки SQLTransientException и SQLNonTransientException). Что это значит? http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html

x) в составе JDK идет JDBC-ODBC мост. Что это значит?

x) у SQLException есть методы getSqlCode() и getErrorCode() - чем они отличаются? как используются в народном хозяйстве? Рассмотрите компоненты Hibernate и Spring - ?, ?.

x) у SQLException есть методы getNextException(), getCause(), iterator() все они связаны с "другими" исключения. Чем они отличаются? Что возвращают?

public class LookForDrivers {
    public static void main(String[] args) {
        Enumeration<Driver> en = DriverManager.getDrivers();
        while (en.hasMoreElements()) {
            System.out.println(en.nextElement());
        }
    }
}

>> sun.jdbc.odbc.JdbcOdbcDriver@4383f74d

x) если Connection стоит в режиме setAutocommit(true), то когда непосредственно происходит commit в таком вызове:
http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html
To be more precise, the default is for a SQL statement to be committed when it is completed, not when it is executed. A statement is completed when all of its result sets and update counts have been retrieved. In almost all cases, however, a statement is completed, and therefore committed, right after it is executed
x) нужно ли делать connection.commit() после select? А rollback?
x) Может ли If a driver does not support the isolation level specified in an invocation of setTransactionIsolation, the driver can substitute a higher, more restrictive transaction isolation level. If a driver cannot substitute a higher transaction level, it throws a SQLException. Use the methodDatabaseMetaData.supportsTransactionIsolationLevel to determine whether or not the driver supports a given level.
http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html
connection.setTransactionIsolation(Connection.TRANSACTION_???) не выставить требуемый уровень изоляции?

x) Что означает и на каком конце (JDBC Driver, DB server) происходит prepared фаза при работе с PreparedStatement?
http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
The advantage to this is that in most cases, this SQL statement is sent to the DBMS right away, where it is compiled



x) Если я в транзакции создам таблицу и добавлю в нее записи а потом сделаю rollback - "все исчезнет"?

x) На каких действиях Hibernate может "сделать" программиста с JDBC по скорости?
x) Как грамотно кэшировать PreparedStatement?
x) Что можно кэшировать при работе с JDBC?
x) java.sql.* vs javax.sql.*
x) если connection.commit() кинул SQLException - что делать? в каком состоянии connection? коммит или роллбак в базе?
x) какой сущности DB соответствует java.sql.Connection?
x) может ли быть и JDBC и embedded DB?
x) может ли быть JDBC для нереляционной DB?
x) stmt = con.createStatement(
           ResultSet.TYPE_SCROLL_SENSITIVE,
           ResultSet.CONCUR_UPDATABLE);
x) есть ли какое то объяснение версий JDBC (1,2,3,4)?
x) conn производит много prepstmt для одного потока - ок? перемежая работу с ними
x) работа batch + Handling Batch Update Exceptions
x) TRANSACTION_NONE?
x) getPrice = con.prepareStatement(query, ResultSet.CLOSE_CURSORS_AT_COMMIT);
x) sqlex.errorcode vs ? number vs string
x) CallableStatement
x) ResultSet objects can have different functionality and characteristics. These characteristics are type, concurrency, and cursor holdability.
That is, it contains the rows that satisfy the query at either the time the query is executed or as the rows are retrieved.
Not all databases and JDBC drivers support all ResultSet types. The methodDatabaseMetaData.supportsResultSetType returns true if the specified ResultSet type is supported and false otherwise.
Not all JDBC drivers and databases support concurrency. The methodDatabaseMetaData.supportsResultSetConcurrency returns true if the specified concurrency level is supported by the driver and false otherwise.

x) можно ли слушать изменения в ДБ?
x) 
x) 
x) 

You can retrieve values using either the index number of the column or the alias or name of the column. The column index is usually more efficient. Columns are numbered from 1. For maximum portability, result set columns within each row should be read in left-to-right order, and each column should be read only once.

Furthermore, if you want an application to retrieve values of any standard SQL type other than SQL3 types, use thegetString method. http://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html




Следующие API
JPA 2
JTA (основано на JTS, которое основано на OTS)
JCA 1.1 
JDO - устаревшее, заменено JPA



----
pattern open session in view + ThreadLocal
declarative tx managing

rowset - listener gof pattern






словарь
roundtrip latency throuthput commit rollback call invoke apply execute manage pool batch overflow crash fail alias query different