顯示具有 OracleDB 標籤的文章。 顯示所有文章
顯示具有 OracleDB 標籤的文章。 顯示所有文章

2013年8月14日 星期三

hibernate connection 隔夜被斷線的問題

最近因為一個Hibernate + Spring + Quartz  的Web專案,  執行完Quartz Scheduler  的Job後,  隔天早上就出現

SQL Error: 17002, SQLState: null
IO 異常: Connection reset
java.sql.SQLException: 關閉的連線

然後就是一堆
SQL Error: 0, SQLState: null
Already closed.
重覆的錯誤

(hibernate connection close overnight的問題, 隔夜connection中斷問題,或是自動重新連線問題…)

Hibernate官網論壇說到

You should never use Hibernate's built-in connection pooling in production; it is non-scalable and non-fault-tolerant. Instead, use DBCP or C3P0 (or, even better, an application server datasource).

Automatic reconnect from Hibernate to MySQL 提出用C3P0

CrazyTechThoughts 在 Resolve Hibernate connection timeout issue with MySQL server 也提出用 c3p0.testConnectionOnCheckout=true 的方法

StackOverflow也有人問 Hibernate, C3P0, Mysql — Broken Pipe

 

好像只能換Connection pool 的技術了, 但我不想將DBCP改為C3P0, 因為還有大部份舊的hibernate mapping 還在運行, 換了之後不知道還要花多少時間測試.

最後我的解決方式:

在 spring 的設定檔內

<bean>
…
<property name="validationQuery" value="SELECT 1 FROM DUAL" />
<property name="testOnBorrow" value="true" />
…
</bean>

因為我用的是OracleDB, 所以用 Select 1 From Dual, 其它資料庫請自行修改.

快一週了,好像還可以, 沒聽到有問題.

ORA-17059: Fail to convert to internal representation

could not read column value from result set 無法轉換為內部方式

這個錯誤原因是:資料庫裡的字段類型與Java裡映射該字段屬性的類型不能對應轉換,例如資料庫裡欄位類型為Varchar2,而Java定義的類型為Long;或者資料裡為Number,而Java定義的對應屬性類型為String。

處理*.hbm.xml大部份都能解決問題.

2012年7月19日 星期四

用DBCA建database後

DBCA重建資料庫後, 一切都後順利, 但是重新開機後, 同事反應, 出現
ORA-12505, TNS: listener does no currently know of SID given in connect descriptor
ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務
Why ? 已經有下dbstart了, lsnrctl 也有 start了, 為何還會出現錯誤.
解決方法如下:
每次Oracle開機,
$> sqlplus / as sysdba
SQL> startup;
即可, 但是每次都要下, 很麻煩; 另一個方法, 修改 oratab

vi /etc/oratab
將
orcl:/oracle/u01/app/oracle/product/10.2.0/db_1:N
改為
orcl:/oracle/u01/app/oracle/product/10.2.0/db_1:Y

下次dbstart 就會自動啟動了.

2012年7月12日 星期四

Oracle 的character set

請一位到職不到一年的同事安裝 OracleDB, 我後悔了, 半年後還在收拾....
因為字元集的錯誤, 匯入了原本 dmp 檔, 不僅匯入過程錯誤, 也造成了 database 內出現了亂碼的 table , 連要刪除tablespace 都刪不掉(constraint索引, 限制條件的相依 ), 更不用說刪除table...最後忍痛把整個database刪除, 重新用DBCA建database, 過程的記錄如下, 如果有相同需求的人, 歡迎一起討論.

查看目前的字集設定
方法1)
SQL>SELECT parameter, value FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET';


方法2)
SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET' ;


有很多方法可以看編碼, google 一下就有了, 就不多說了.




我的想法是先把編碼改好, 再匯入dmp檔, 看有沒有得救.


所以主要是NLS_CHARACTERSET的值, 我要改成ZHT16MSWIN950, 語法如下:


#sqlplus / as sysdba
進入splplus 後

shutdown immediate;
startup mount;


alter database open;
alter database character set internal_use ZHT16MSWIN950;


shutdown immediate;
startup;

done;完成了.
再用上面的語法檢查一次.

PS: 其實在client有一個方法, 可以不用動到Server端, 但是你必須要每個client都是設定環境變數, 不是很理想.

但是如上面提到, 我的OracleDB還是一樣, 無法刪除亂碼的table, 所以後來還是整個database刪除, 再重建, OracleDB重建資料庫很麻煩, 我最後還是用UI界面處理, 下一篇再Post上來了.