2013-02-25 20 views
0

我有一張桌子。MySQL自動截斷不能與c3p0一起使用

mysql> SELECT @@GLOBAL.sql_mode; 

...返回空。

mysql> create table testtable (name varbinary(5)); 

mysql> insert into testtable values('hellowhowareyoudsafafas'); 

Query OK, 1 row affected, 1 warning (0.00 sec) 

將數據插入表中。但是如果我使用c3p0的ComboPoolDataSource,我會得到例外com.mysql.jdbc.MysqlDataTruncation

因爲我沒有在MySQL 5.1上設置MySQL嚴格模式,所以我期待數據存儲在表中。我應該怎麼做才能通過c3p0自動截斷。

=====確定我做到了,但有一個更合適的方法======

PreparedStatement ps1 = connection.prepareStatement("SELECT @@sql_mode"); 
    ResultSet rs = ps1.executeQuery(); 
    String originalSqlMode = ""; 
    if(rs.next()) { 
     originalSqlMode = rs.getString(1); 
     System.out.println(originalSqlMode); 
    } 
    String newSqlMode = originalSqlMode.replace("STRICT_ALL_TABLES", "").replace("STRICT_TRANS_TABLES", "").replace(",,", ","); 
    ps1 = connection.prepareStatement("SET SESSION sql_mode=?"); 
    ps1.setString(1, newSqlMode); 
    ps1.execute(); 
    PreparedStatement ps2 = connection.prepareStatement("insert into testtable values (?)"); 
    ps2.setString(1, "indianpeople"); 
    ps2.execute(); 
+0

這裏有一個我的想法,直到你得到一個正確的答案......即使在MySQL中,你也會得到一個警告。我認爲抓住'MysqlDataTruncation'將是忽略警告的Java等價物。 – 2013-02-25 10:38:17

回答

0

所以,可能是最簡單的解決方案,如果你控制的數據庫,是執行的MySQL在希望使用mysqld上的--sql-mode開關的模式下。請參閱http://dev.mysql.com/doc/refman/5.6/en/server-sql-mode.html

如果這不是一個選項,您可以在c3p0 ConnectionCustomizer中使用模式更改代碼。它看起來像「會話」被定義爲連接的生命週期,所以你應該能夠重寫AbstractConnectionCustomizer的onAcquire方法。當從數據庫中獲取連接時,該選項將只設置一次。見http://www.mchange.com/projects/c3p0/#connection_customizers

祝你好運!