MySQL, Spring и пр
16 февраля 2006
Вот тут у меня небольшая дискуссия возникла по поводу кодировок в 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

апреля 21, 2006 в 09:56
Вообще в 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.
апреля 21, 2006 в 09:59
Спасибо большое, не знал об этом.
апреля 21, 2006 в 09:59
Забыл сказать, что значения сгенерированых полей можно вычитать из ResulSet-а, возвращаемого методом getGeneratedKeys твоего Statemen-а. И еще, аналогичная функциональность, естественно, есть и у PreparedStatement, единственное отличие, что его нужно созавать с нужными флагами или массивами столбцов (см. Connection.create)
мая 17, 2006 в 17:56
А по подробнее с примерами можно?