2013-03-13 6 views
3

Я использую BoneCP с Postgresql и Spring JdbcTemplate. Когда JdbcTemplate выполняет запрос, а затем пытается закрыть соединение, он получает это исключение:Невозможно изменить свойство транзакции только для чтения в середине транзакции

org.postgresql.util.PSQLException: Невозможно изменить транзакцию только для чтения свойства в середине транзакции. на org.postgresql.jdbc2.AbstractJdbc2Connection.setReadOnly (AbstractJdbc2Connection.java:725) на com.jolbox.bonecp.ConnectionHandle.setReadOnly (ConnectionHandle.java:1279) на com.jolbox.bonecp.ConnectionHandle. (ConnectionHandle .java: 254) на com.jolbox.bonecp.ConnectionHandle.recreateConnectionHandle (ConnectionHandle.java:273) в com.jolbox.bonecp.ConnectionHandle.close (ConnectionHandle.java:476) на org.springframework.jdbc .datasource.DataSourceUtils.doCloseConnection (DataSourceUtils.java:341) по адресу org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection (DataSourceUtils.java:328) в org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection (DataSourceUtils.java:294) на org.springframework.jdbc.core.JdbcTemplate.execute (JdbcTemplate.java:411) на org.springframework.jdbc .core.JdbcTemplate.query (JdbcTemplate.java:456) на org.springframework.jdbc.core.JdbcTemplate.query (JdbcTemplate.java:464) на org.springframework.jdbc.core.JdbcTemplate.queryForObject (JdbcTemplate .java: 472) на org.springframework.jdbc.core.JdbcTemplate.queryForObject (JdbcTemplate.java:477)

Поскольку он не может закрыть соединения, открытые соединения достигают максимального номера соединения, тогда приложение перестает отвечать на запросы.

Я не устанавливаю никаких свойств, связанных с транзакциями. Таким образом, параметры транзакции должны быть по умолчанию. Как я могу это исправить?

зависимостях и конфигурации:

bonecp 0.8.0-rc1 9.2-1002.jdbc4 PostgreSQL весна-3.2.1.RELEASE

JDBC
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"  destroy-method="close">   <property name="driverClass" value="org.postgresql.Driver" />  <property name="jdbcUrl" value="jdbc:postgresql://127.0.0.1/mkayman" />   <property name="username" value="mkayman" />  <property name="password" value="" />  <property name="idleConnectionTestPeriodInMinutes" value="5" />   <property name="idleMaxAgeInMinutes" value="30" />  <property name="maxConnectionsPerPartition" value="5" />  <property name="minConnectionsPerPartition" value="2" />  <property name="partitionCount" value="2" />  <property name="acquireIncrement" value="1" />  <property name="statementsCacheSize" value="100" />  </bean> 

ответ

2

Я столкнулся с этим вопросом сегодня. Возможно, вам не хватает одной из необходимых зависимостей boneCP.

Мне не хватает библиотеки SLF4J и получаю то же сообщение. Проверьте, есть ли у вас зависимостей здесь: http://jolbox.com/index.html?page=http://jolbox.com/requirements.html

+0

Я столкнулся с той же проблемой, и добавление зависимостей не помогло решить эту проблему. В любом случае, из-за ошибки проблема не похожа на то, что она не находит класс, на который она хочет ссылаться, но что-то о конфигурации пула соединений. – Salil

0

Я столкнулся с той же проблемой и смог ее решить, выполнив эти два шага:

  • установки уровня изоляции, добавив эти заявления: конфигурации. setDefaultTransactionIsolation ("READ UNCOMMITTED");

  • совершить каждую транзакцию до закрытия.

Я не уверен, какой из них решил проблему или если они необходимы.

+0

Настройка 'READ UNCOMMITTED' звучит как плохая идея - потому что тогда вы можете получить довольно случайные результаты, когда вы читаете данные, которые пишут другие транзакции, возможно, их даже отбросят назад. Возможно, это работает для вас в вашем конкретном случае, но я бы не рекомендовал его вообще. Или, по крайней мере, предупредить людей о том, что он делает – KajMagnus