MySQL, Spring и пр

Вот тут у меня небольшая дискуссия возникла по поводу кодировок в mysql и пр.
Так как это немного перерастает размер коментариев обобщу все одним постом.

Вот так например можно делать датасурс с пулом к MySQL:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
 <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
 <property name="url" value="jdbc:mysql://localhost/wallpapers?autoReconnect=true&autoPoolReconnect=true&useUnicode=true"/>
 <property name="username" value="user"/>
 <property name="password" value="pass"/>
 <property name="maxActive" value="500"/>
 <property name="initialSize" value="50"/>
</bean>

В строке соединения:
autoReconnect и autoPoolReconnect заставляют переконнекчиватся к базе при потере соединения. MySQL сам сбрасывается неиспользуемую коннекцию, помоему через 12 часов (поправте меня если что), и если в пуле будет коннекция которая столько времени не использовалась, то она оборвется и когда пулу она потребуется то приложение свалится. А useUnicode дружит нас русским языком, точнее с Unicode, т.е. в базе не будут лежать символы вопроса вместо русских букв.

Параметры maxActive и initialSize указывают на размер пула (пояснения что где думаю излишни)

Далее, если не используется data access layer, то используем коннекцию как обычно. Ну а удобней всеже передать этот датасурс Hibernat'у или чему подобному.

Через BasicDataSource можно достучатся до самого драйвера, если надо. Например чтобы не вызывать

SELECT LAST_INSERT_ID()

после вставки в табличку с auto_increment, можно сделать так:

((com.mysql.jdbc.PreparedStatement)(((DelegatingPreparedStatement)ps).getInnermostDelegate())).getLastInsertID();

где ps это PreparedStatement через который запихивали данные.

А вообще: пользуйте PostgreSQL, а лучше Oracle 🙂

  • http:// lucker

    Вообще в JDBC с третей версии есть возможность получать значения auto_increment полей, вставленых в таблицы в результате выполнения INSERT запроса стандартным образом.

    Сделать это можно, передав в методы execute или executeUpdate объекта класса Statemen на выбор или

    флаг Statement.RETURN_GENERATED_KEYS и массив номеров/имен столбцов в запросе, auto_increment значения которых нужно получить.

    Ну и естественно этот факт не могли обойти стороной и разработчики спринга, любезно добавив в JdbcTemplate вариант метода update, принимающего в качестве параметра объект класса KeyHolder, в который после выполнения запроса быдут записаны значения auto_increment полей.

    P.S. Еще советую посмотреть на пакет org.springframework.jdbc.support.incrementer, так как он может оказаться полезным в случае если используются sequense's.

  • http:// igor

    Спасибо большое, не знал об этом.

  • http:// lucker

    Забыл сказать, что значения сгенерированых полей можно вычитать из ResulSet-а, возвращаемого методом getGeneratedKeys твоего Statemen-а. И еще, аналогичная функциональность, естественно, есть и у PreparedStatement, единственное отличие, что его нужно созавать с нужными флагами или массивами столбцов (см. Connection.create)

  • http:// Asd

    А по подробнее с примерами можно?