2013-07-16 23 views
1

關閉的連接我已經ORMLite配置像ORMLite文檔的樣品7,但是當我拿到後連接關閉錯誤與ORMLite和MySQL

java.sql.SQLException: Connection has already been closed 
at com.j256.ormlite.jdbc.JdbcConnectionSource.getReadWriteConnection (JdbcConnectionSource.java:177) 
at com.j256.ormlite.jdbc.JdbcConnectionSource.getReadOnlyConnection(JdbcConnectionSource.java:168) 
at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:228) 
at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:181) 
at com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:263) 
at com.tube.auction.db.DbFacade.createOrUpdateUser(DbFacade.java:265) 

我在代碼中只使用DAO豆。

<bean id="databaseUrl" class="java.lang.String"> 
    <constructor-arg index="0" value="jdbc:mysql://localhost:3306/auction" /> 
</bean> 

<bean id="connectionSource" class="com.j256.ormlite.jdbc.JdbcConnectionSource" init-method="initialize"> 
    <property name="url" ref="databaseUrl" />   
    <property name="username" value="root" /> 
    <property name="password" value="" /> 
</bean> 
<bean id="userDao" class="com.j256.ormlite.spring.DaoFactory" factory-method="createDao"> 
    <constructor-arg index="0" ref="connectionSource" /> 
    <constructor-arg index="1" value="com.tube.auction.dto.User" /> 
</bean> 

如何處理Connection關閉的問題?我看不到任何方式強制連接重啓 例如 注意ISOPEN()用於dao.connection returns true

-- 1. Can i test connection here and restart it? How? Code snippet? 
try { 
    userDao.queryForId(someUserId); 
} catch(SQLException ex) { 
    if(is this connection closed?) { 
     -- 2. What should I do here to restart connection? 
    } 
} 
+0

最大的貓你是怎麼解決的正是這個問題? – dorin

回答

0

我認爲這是一個常見問題。一段時間後,服務器可能會關閉數據庫連接,因爲它在一段時間內還沒有被使用或出於其他原因。

我談保持連接,這個答案在這裏開的方法:

org.hibernate.exception.GenericJDBCException: could not execute query

引述,有很多方法可以解決此問題:

  1. 您可以每隔一段時間在連接上發出某種「保持活動」類型的查詢(例如:SELECT 1)以保持活動狀態。這假設它因爲閒置而關閉。你可以使用ORMLite的「原始查詢」。
  2. 您可以經常重新打開連接。使用ORMLite,這取決於您使用的是哪種連接源。
  3. 如果你得到一個連接關閉異常,那麼你可以重新打開連接。咄。
  4. 您可以使用可以爲您保持活動狀態和重新連接的連接池。 Apache's DBCPHikariCP是我最喜歡的兩個。他們與ORMLite合作。

查看我的答案獲取更多詳情。

+0

好主意,然而,沒有真正解決這個問題。這個問題特別提到如何在ORMLite中做到這一點。 – MCToon

+0

ORMlite可以與DBCP和其他連接池庫@MCToon一起使用。這是最好的答案。 – Gray

0

JdbcConnectionSource沒有內部保活機制。 JdbcPooledConnectionSource產生一個內部線程來執行保持活着的測試。這解決了我的問題。

嘗試改變這個bean連接源使用JdbcPooledConnectionSource,像這樣:

<bean id="connectionSource" class="com.j256.ormlite.jdbc.JdbcPooledConnectionSource" init-method="initialize">