Проблема пула соединений с Spring и программным управлением транзакциями - PullRequest
0 голосов
/ 17 августа 2010

Мне нужна ваша помощь для решения проблемы пула соединений с Spring. Я использую Spring с Java 1.4 (без комментариев).

Вот источник данных и определение пула соединений:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName">
        <value>${database.jdbcName}</value>
    </property>
    <property name="url" value="jdbc:sybase:${database.url}">
    </property>
    <property name="username">
        <value>${database.username}</value>
    </property>
    <property name="password">
        <value>${database.password}</value>
    </property>
    <property name="maxActive">
         <value>${database.maxActive}</value>
    </property>
    <property name="maxIdle" >
         <value>${database.maxIdle}</value>
    </property>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>     
    <property name="hibernateProperties">
        <props>         
            <prop key="hibernate.dialect">org.hibernate.dialect.SybaseDialect</prop>
            <prop key="show_sql">true</prop>
            <prop key="hibernate.connection.release_mode">after_transaction</prop>  
            <prop key="hibernate.dbcp.maxWait">100000</prop>
            <prop key="hibernate.connection.autocommit">false</prop>
            <prop key="cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>             
        </props>
    </property>     
    ...     

Когда все соединения активны, если системе требуется новое соединение, я получил сообщение «открытие соединения JDBC», и весь процесс остановлен. Я не понимаю, почему все темы заблокированы.

Все сервисы и классы DAO определены как одиночные в контексте приложения Spring.

Есть идеи?

Спасибо за вашу помощь.

Béranger

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Какие значения вы используете для maxActive и maxIdle? Я могу дать вам более точный ответ, если я знаю эти значения, но в то же время вы также можете попробовать изменить значение hibernate.dbcp.maxWait с 100000 на 1 и протестировать приложение.

Также убедитесь, что вы случайно не применили некоторые методы DAO synchronized.

0 голосов
/ 17 августа 2010

Это было странно, но я наконец решил свою проблему.

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

Вот код, используемый для начала транзакции:

//Return Spring context
ApplicationContext context = ApplicationContextHolder.getContext();
// transactionManager 
PlatformTransactionManager transactionManager = (PlatformTransactionManager) context.getBean("txManager");
//Set propagation required
DefaultTransactionDefinition td = new DefaultTransactionDefinition();
td.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// Begin
TransactionStatus transactionStatus = transactionManager.getTransaction(td);

Как видите, я установил программные транзакции как «обязательные».Но когда эти транзакции были запущены в контексте транзакций, Spring не распознал текущую транзакцию и начал новую.Это привело к блокировке соединения ...

Я решил эту загадку, удалив программное управление транзакциями.

...