2016-09-09 4 views
-1

У меня проблема в моем вызове JCBC Spring MVC. Если я быстро сделаю вызов после запуска сервера, соединение JDBC будет выполнено за секунду и данные будут восстановлены. Аналогично, если другие DAO вызываются быстро друг с другом, соединение выполняется в ближайшее время. Но если я попытаюсь позвонить в DAO после разрыва даже на несколько минут, соединение JDBC навсегда будет выполнено. Он застревает наСоединение JDBC слишком длинное

«DataSourceUtils: 110 - Fetching JDBC Connection из DataSource»

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

Далее я пытаюсь перезагрузить сервер как минимум. Но JDBC препятствует даже остановке сервера! Консоль застрял на этой линии:

«DisposableBeanAdapter: 327 - Вызов уничтожить метод„закрыть“на боб с именем" DataSource»

В конце концов я перезапустить Eclipse, и она работает хорошо до тех пор, пока промежуток времени снова.

Это мое определение компонента для источника данных:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="url" /> 
    <property name="username" value="abc" /> 
    <property name="password" value="abc" /> 
    <property name="validationQuery" value="SELECT 1" /> 
    <property name="testWhileIdle" value="true" /> 
    <property name="maxActive" value="100" /> 
    <property name="minIdle" value="10" /> 
    <property name="initialSize" value="10" /> 
    <property name="maxIdle" value="20" /> 
    <property name="maxWait" value="1000" /> 
</bean> 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<bean id="getDataDao" class="com.project.dao.GetDataDao"> 
    <constructor-arg index="0" ref="jdbcTemplate" /> 
    <constructor-arg index="1" value="STORED_PROC_NAME"></constructor-arg> 
</bean> 

В моем файле DAO, я расширить класс StoredProcedure Spring, и это является конструктор:

public GetDataDao(JdbcTemplate jdbcTemplate, String spName) { 

     super(jdbcTemplate, spName); 

     declareParameter(new SqlParameter("p_input", Types.VARCHAR)); 
     declareParameter(new SqlOutParameter("o_result", Types.VARCHAR)); 

     compile(); 
    } 

В другой функции, это как я называю SP:

spOutput = super.execute(spInput); 

где spOutput и spInput - это HashMaps.

Я что-то не так в своей конфигурации? ТИА.

+1

Не в вашей конфигурации, я подозреваю, что в вашем коде ... Не подключайтесь сами и используйте транзакции, управляемые весной. Если yuo, ваш пул не будет исчерпан доступными соединениями.В вашем случае после примерно 100 запросов (если вы не настроили MySQL, чтобы запретить эти подключения). –

+2

Eclipse не имеет к этому никакого отношения. Я никогда не понимаю, почему люди упоминают их IDE, когда у них проблемы. Spring делает это правильно каждый день в моих приложениях; это что-то в вашем коде. – duffymo

+0

Измените свой вопрос и опубликуйте код, где вы получаете и используете соединение. – kaliatech

ответ

-1

Дополнительный код помогает, но я ничего не вижу в нем, что вызовет проблему, которую вы видите. Наиболее вероятная причина проблемы, которую вы видите, заключается в том, что соединения вытаскиваются из пула, но они не возвращаются, и пул в конечном итоге становится голодным. Затем пул dbcp блокирует ваше завершение работы, поскольку эти соединения все еще открыты и, вероятно, висят.

Чтобы проверить, возможно, вы попытаетесь установить maxActive и аналогичные настройки на что-то значительно ниже, возможно, даже на «1», а затем убедитесь, что вы сразу же получаете такую ​​же проблему.

Вы подтвердили, что ваша хранимая процедура возвращается? т. е. вы фактически получаете spOutput для каждого вызова, и сама хранимая процедура не зависает последовательно или случайным образом?

Если это так, то мое единственное другое предложение - разместить больше кода, особенно из стека вызовов, ведущего в GetDataDao, и включая любой метод в DAO, вызывающий вызов sp.execute. Предполагается, что вы не используете транзакции, но если да, то показ, где вы начинаете/совершаете транзакцию в коде, также очень важно.

+0

'spOutput' правильно возвращает данные. При подключении он зависает. Как только это будет установлено, SP будет выполняться быстро, и данные будут восстановлены. Я не думаю, что они останутся в коде. Это не имеет никакого отношения к соединению JDBC. – javaGirl243

+0

Могу ли я узнать, почему мой вопрос был проголосован, пожалуйста? – javaGirl243

+0

@ javaGirl243 - Я не спустил вас вниз, но предполагаю, что это потому, что ваш вопрос непонятен и не содержит достаточной информации для того, чтобы кто-то действительно помог вам. Точно так же мой ответ был занижен, вероятно, потому, что я не дал краткий ответ, и downvoter не думал, что на ваш вопрос должен был быть дан ответ. Предложил бы опубликовать новый вопрос, но с сохранением его краткости и показом недостающего кода, о котором я упоминал в своем ответе. StackOverflow не всегда является дружественным местом для новичков, но, тем не менее, цель состоит в том, чтобы поддерживать определенное качество вопросов и ответов. – kaliatech

Смежные вопросы